mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-10-07 05:56:40 +00:00
feat(oci): run official container images as native LXC containers
Adds the OCI manager: an engine that turns a Docker Compose file into an LXC definition, a catalog of 365 applications drawn from LinuxServer.io and other container image sources, and a per-instance registry recording what each container was built from. Reachable from the main menu. Catalog text is translated like every other string in the project: the taglines go through translate() and land in lang/*.json, so the entries read in all eight languages instead of only English. Translation cache builder: - a failed translation leaves the key absent rather than writing English, which previously made the string count as translated forever - a result identical to a 3+ word source is rejected, catching a provider that silently returns the text it was given - strings that are nothing but glossary terms keep their source spelling instead of being discarded as failures - no backoff between attempts when the provider is deterministic - application names are protected so "HAOS One" survives translation - argos joins the provider list, and the workflow reads the OCI sources Audit & Report: - findings that moved in the wrong direction between runs are reported alongside the ones that improved - an accepted risk can carry a review date and is flagged when it falls due - backup checks explain in plain language what they looked at and what to do next Monitor: - disks can be excluded from periodic reads, and an idle disk says so instead of showing a stale temperature - per-disk identity survives a controller or enclosure change - scheduled Borg backups resolve their SSH key from the repository entry - PVE upgrades log the package list and the resulting dpkg changes The web build no longer copies scripts/ into public/: the documentation links to GitHub, so nothing read that folder. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,423 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-2fauth",
|
||||
"status": "laboratory-validated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "2FAuth"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "A web app to manage your Two-Factor Authentication (2FA) accounts and generate their security codes"
|
||||
},
|
||||
"description": {
|
||||
"en_US": "2FAuth is a web based self-hosted alternative to One Time Passcode (OTP) generators like Google Authenticator, designed for both mobile and desktop."
|
||||
},
|
||||
"category": "security",
|
||||
"category_label": "Authentication & Security",
|
||||
"author": "Bubka",
|
||||
"developer": "Bubka",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 8000,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://2fauth.app",
|
||||
"documentation": null,
|
||||
"repository": "https://hub.docker.com/r/2fauth/2fauth",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "official",
|
||||
"repository": "https://hub.docker.com/r/2fauth/2fauth",
|
||||
"revision": "c253dbe602c2b09b665826316933397082a2c126ddb3f312cc5783558b38932e",
|
||||
"image_repository_url": "https://hub.docker.com/r/2fauth/2fauth",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "c253dbe602c2b09b665826316933397082a2c126ddb3f312cc5783558b38932e",
|
||||
"generated_at": "2026-09-13T15:34:57+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "2fauth",
|
||||
"container_name": "2fauth",
|
||||
"image": {
|
||||
"reference": "2fauth/2fauth:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "2fauth/2fauth",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "APP_KEY",
|
||||
"example": "${GENERATED_APP_KEY}",
|
||||
"required": true,
|
||||
"sensitive": true,
|
||||
"source": "docker-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/2fauth",
|
||||
"compose_source_example": "/DATA/AppData/$AppID",
|
||||
"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": 8000,
|
||||
"published_example": 8000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "always",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "name: 2fauth\nservices:\n 2fauth:\n image: 2fauth/2fauth:latest\n deploy:\n resources:\n reservations:\n memory: 64M\n network_mode: bridge\n ports:\n - target: 8000\n published: '8000'\n protocol: tcp\n restart: always\n volumes:\n - type: bind\n source: /DATA/AppData/$AppID\n target: /2fauth\n environment:\n APP_KEY: ${GENERATED_APP_KEY}\n container_name: 2fauth\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "2fauth",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "2fauth",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "2fauth",
|
||||
"image": "2fauth/2fauth:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"image": "2fauth/2fauth:latest",
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "64M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"network_mode": "bridge",
|
||||
"ports": [
|
||||
{
|
||||
"target": 8000,
|
||||
"published": "8000",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"restart": "always",
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID",
|
||||
"target": "/2fauth"
|
||||
}
|
||||
],
|
||||
"environment": {
|
||||
"APP_KEY": "${GENERATED_APP_KEY}"
|
||||
},
|
||||
"container_name": "2fauth"
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "2fauth"
|
||||
},
|
||||
"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": "2fauth-volume-0",
|
||||
"service": "2fauth",
|
||||
"container_path": "/2fauth",
|
||||
"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": [
|
||||
"2fauth"
|
||||
],
|
||||
"stop_order": [
|
||||
"2fauth"
|
||||
],
|
||||
"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": "app-key",
|
||||
"strategy": "generate-cryptographically-random-at-install",
|
||||
"bindings": [
|
||||
{
|
||||
"service": "2fauth",
|
||||
"environment_variable": "APP_KEY"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 8000,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"credentials": []
|
||||
},
|
||||
"proxmox": {
|
||||
"runtime": "native-oci-lxc",
|
||||
"technology_status": "proxmox-technology-preview",
|
||||
"defaults": {
|
||||
"unprivileged": true,
|
||||
"ostype": "auto-from-image",
|
||||
"cores": 2,
|
||||
"memory_mb": 128,
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"user",
|
||||
"volumes",
|
||||
"working_dir"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "Single-image definitions are installable when every declared Compose option has a native Proxmox translation. Multi-image and unsupported runtime features remain blocked until their orchestrator or mapping is available."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "passed-amd64",
|
||||
"service_health": "passed-amd64",
|
||||
"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,400 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-actualbudget",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Actual Budget"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Privacy-first finance app with envelope budgeting and multi-device sync."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Actual Budget is a fast, privacy-focused finance management app using local-first envelope budgeting, ensuring full control over data. Its intuitive interface supports offline use, with multi-device sync and optional end-to-end encryption, delivering a secure, efficient financial management experience, ideal for users seeking clear financial oversight.\n\nThe app's core features include envelope budgeting based on real income, rapid transaction handling, and intuitive financial reporting. It helps users track spending and monitor monthly savings clearly, with a streamlined transaction editor for quick categorization, split transactions, and transfers. Built-in net worth and cash flow reports provide financial insights, and a custom report engine allows tailored reports for specific needs. Undo and redo functionality ensures users can easily correct mistakes, maintaining operational flexibility.\n\nIt integrates bank accounts via goCardless (EU/UK) or SimpleFIN (US/Canada), supports multi-device syncing for data privacy, and enables importing transaction data from YNAB4, nYNAB, and QIF, OFX, QFX, CAMT.053, CSV files, simplifying migration of existing financial records. Community documentation enhances usability, and the app's simple operation and high flexibility deliver a modern finance management solution.\n\n**Key Features:**\n- Privacy-focused personal finance management\n- Envelope budgeting methodology\n- Multi-device synchronization\n- End-to-end encryption support\n- Local data ownership\n- Fast and responsive interface\n- Open source and self-hosted\n- Bank account synchronization\n- Detailed financial reporting\n- Budget tracking and analysis\n\n**Learn More:**\n- [Actual Budget Official Website](https://actualbudget.org)\n- [Actual Budget GitHub Repository](https://github.com/actualbudget/actual)\n- [Actual Budget Docker Image](https://hub.docker.com/r/actualbudget/actual-server)\n"
|
||||
},
|
||||
"category": "finance",
|
||||
"category_label": "Finance & Budgeting",
|
||||
"author": "ActualBudget",
|
||||
"developer": "ActualBudget",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 5006,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://actualbudget.org",
|
||||
"documentation": null,
|
||||
"repository": "https://hub.docker.com/r/actualbudget/actual-server",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "official",
|
||||
"repository": "https://hub.docker.com/r/actualbudget/actual-server",
|
||||
"revision": "4a2a6ebc056da1fc016fbe7937484ca6c670fc056450e4d676ee663bf9962bb1",
|
||||
"image_repository_url": "https://hub.docker.com/r/actualbudget/actual-server",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "4a2a6ebc056da1fc016fbe7937484ca6c670fc056450e4d676ee663bf9962bb1",
|
||||
"generated_at": "2026-09-13T15:34:57+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "actualbudget",
|
||||
"container_name": "actualbudget",
|
||||
"image": {
|
||||
"reference": "actualbudget/actual-server:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "actualbudget/actual-server",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/data",
|
||||
"compose_source_example": "/DATA/AppData/$AppID",
|
||||
"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": 5006,
|
||||
"published_example": 15006,
|
||||
"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: actualbudget\nservices:\n actualbudget:\n image: actualbudget/actual-server:latest\n container_name: actualbudget\n deploy:\n resources:\n reservations:\n memory: 128M\n restart: unless-stopped\n volumes:\n - type: bind\n source: /DATA/AppData/$AppID\n target: /data\n ports:\n - target: 5006\n published: '15006'\n protocol: tcp\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "actualbudget",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "actualbudget",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "actualbudget",
|
||||
"image": "actualbudget/actual-server:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"image": "actualbudget/actual-server:latest",
|
||||
"container_name": "actualbudget",
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "128M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"restart": "unless-stopped",
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID",
|
||||
"target": "/data"
|
||||
}
|
||||
],
|
||||
"ports": [
|
||||
{
|
||||
"target": 5006,
|
||||
"published": "15006",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "actualbudget"
|
||||
},
|
||||
"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": "actualbudget-volume-0",
|
||||
"service": "actualbudget",
|
||||
"container_path": "/data",
|
||||
"mode": "host-bind",
|
||||
"user_selectable": true,
|
||||
"backup": false,
|
||||
"shared_with_other_lxc": true,
|
||||
"source_path": null,
|
||||
"source_path_prompt": "Host directory for actualbudget:/data"
|
||||
}
|
||||
],
|
||||
"orchestration": {
|
||||
"reserve_vmids_atomically": 1,
|
||||
"start_order": [
|
||||
"actualbudget"
|
||||
],
|
||||
"stop_order": [
|
||||
"actualbudget"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 5006,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"credentials": []
|
||||
},
|
||||
"proxmox": {
|
||||
"runtime": "native-oci-lxc",
|
||||
"technology_status": "proxmox-technology-preview",
|
||||
"defaults": {
|
||||
"unprivileged": true,
|
||||
"ostype": "auto-from-image",
|
||||
"cores": 2,
|
||||
"memory_mb": 128,
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"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,481 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-adguard-home",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "AdGuard Home"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Network-wide ad and tracker blocking"
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Difference from Traditional Ad Blockers. Unlike traditional ad-blocking plugins that work only on individual devices, AdGuard Home offers a network-wide solution. By setting it up, you can block ads and trackers across all your home devices without needing to install any additional software on each device. This means comprehensive protection with minimal effort.\n\nHow AdGuard Home Works and How to Use It. AdGuard Home functions as a DNS server that reroutes tracking domains to a \"black hole,\" effectively preventing your devices from connecting to these servers. This blocks ads and trackers not only on your computer but also on your smartphone and smart home devices. To start using AdGuard Home, deploy it on your device, then change the DNS address assigned by DHCP on your router to the IP address of your AdGuard Home server.\n\nBenefits of Deploying AdGuard Home on self-hosted server Private Cloud. Deploying AdGuard Home on a self-hosted server device simplifies network-wide ad and tracker blocking, providing a seamless and secure browsing experience for all your home devices. With self-hosted server, you gain the flexibility to monitor network activity and create custom filtering rules tailored to your needs.\n"
|
||||
},
|
||||
"category": "network",
|
||||
"category_label": "Network & Firewall",
|
||||
"author": "AdguardTeam",
|
||||
"developer": "AdguardTeam",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 3000,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://adguard.com/en/adguard-home/overview.html",
|
||||
"documentation": null,
|
||||
"repository": "https://hub.docker.com/r/adguard/adguardhome",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "official",
|
||||
"repository": "https://hub.docker.com/r/adguard/adguardhome",
|
||||
"revision": "f867788b8d2a98c367f6160bc3ae3ce515c037665242005c627bea1269aca62f",
|
||||
"image_repository_url": "https://hub.docker.com/r/adguard/adguardhome",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "f867788b8d2a98c367f6160bc3ae3ce515c037665242005c627bea1269aca62f",
|
||||
"generated_at": "2026-09-13T15:34:57+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "adguard-home",
|
||||
"container_name": "adguard-home",
|
||||
"image": {
|
||||
"reference": "adguard/adguardhome:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "adguard/adguardhome",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/opt/adguardhome/work",
|
||||
"compose_source_example": "/DATA/AppData/$AppID/opt/adguardhome/work",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-1",
|
||||
"container_path": "/opt/adguardhome/conf",
|
||||
"compose_source_example": "/DATA/AppData/$AppID/opt/adguardhome/conf",
|
||||
"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": 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"
|
||||
},
|
||||
{
|
||||
"container_port": 3000,
|
||||
"published_example": 3001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 853,
|
||||
"published_example": 853,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 784,
|
||||
"published_example": 784,
|
||||
"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: adguard-home\nservices:\n adguard-home:\n image: adguard/adguardhome:latest\n deploy:\n resources:\n reservations:\n memory: 64M\n network_mode: bridge\n ports:\n - target: 53\n published: '53'\n protocol: tcp\n - target: 53\n published: '53'\n protocol: udp\n - target: 3000\n published: '3001'\n protocol: tcp\n - target: 853\n published: '853'\n protocol: tcp\n - target: 784\n published: '784'\n protocol: udp\n restart: unless-stopped\n volumes:\n - type: bind\n source: /DATA/AppData/$AppID/opt/adguardhome/work\n target: /opt/adguardhome/work\n - type: bind\n source: /DATA/AppData/$AppID/opt/adguardhome/conf\n target: /opt/adguardhome/conf\n container_name: adguard-home\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "adguard-home",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "adguard-home",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "adguard-home",
|
||||
"image": "adguard/adguardhome:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"image": "adguard/adguardhome:latest",
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "64M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"network_mode": "bridge",
|
||||
"ports": [
|
||||
{
|
||||
"target": 53,
|
||||
"published": "53",
|
||||
"protocol": "tcp"
|
||||
},
|
||||
{
|
||||
"target": 53,
|
||||
"published": "53",
|
||||
"protocol": "udp"
|
||||
},
|
||||
{
|
||||
"target": 3000,
|
||||
"published": "3001",
|
||||
"protocol": "tcp"
|
||||
},
|
||||
{
|
||||
"target": 853,
|
||||
"published": "853",
|
||||
"protocol": "tcp"
|
||||
},
|
||||
{
|
||||
"target": 784,
|
||||
"published": "784",
|
||||
"protocol": "udp"
|
||||
}
|
||||
],
|
||||
"restart": "unless-stopped",
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/opt/adguardhome/work",
|
||||
"target": "/opt/adguardhome/work"
|
||||
},
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/opt/adguardhome/conf",
|
||||
"target": "/opt/adguardhome/conf"
|
||||
}
|
||||
],
|
||||
"container_name": "adguard-home"
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "adguard-home"
|
||||
},
|
||||
"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": "adguard-home-volume-0",
|
||||
"service": "adguard-home",
|
||||
"container_path": "/opt/adguardhome/work",
|
||||
"mode": "managed-volume",
|
||||
"user_selectable": false,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"source_path": null,
|
||||
"source_path_prompt": null
|
||||
},
|
||||
{
|
||||
"id": "adguard-home-volume-1",
|
||||
"service": "adguard-home",
|
||||
"container_path": "/opt/adguardhome/conf",
|
||||
"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": [
|
||||
"adguard-home"
|
||||
],
|
||||
"stop_order": [
|
||||
"adguard-home"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 3000,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"credentials": []
|
||||
},
|
||||
"proxmox": {
|
||||
"runtime": "native-oci-lxc",
|
||||
"technology_status": "proxmox-technology-preview",
|
||||
"defaults": {
|
||||
"unprivileged": true,
|
||||
"ostype": "auto-from-image",
|
||||
"cores": 2,
|
||||
"memory_mb": 128,
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"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,248 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-adguardhome-sync",
|
||||
"status": "laboratory-validated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Adguardhome Sync"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Adguardhome-sync is a tool to synchronize AdGuardHome config to replica instances."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Adguardhome-sync is a tool to synchronize AdGuardHome config to replica instances."
|
||||
},
|
||||
"category": "adblock",
|
||||
"category_label": "Adblock & DNS",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/adguardhome-sync-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/adguardhome-sync-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 8080,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://github.com/bakito/adguardhome-sync/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-adguardhome-sync/",
|
||||
"repository": "https://github.com/linuxserver/docker-adguardhome-sync",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-07-05",
|
||||
"note": "Rebase to Alpine 3.24."
|
||||
},
|
||||
{
|
||||
"date": "2025-12-28",
|
||||
"note": "Rebase to Alpine 3.23."
|
||||
},
|
||||
{
|
||||
"date": "2025-07-05",
|
||||
"note": "Rebase to Alpine 3.22."
|
||||
},
|
||||
{
|
||||
"date": "2024-12-17",
|
||||
"note": "Rebase to Alpine 3.21."
|
||||
},
|
||||
{
|
||||
"date": "2024-05-24",
|
||||
"note": "Rebase to Alpine 3.20."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-07-05"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-adguardhome-sync",
|
||||
"default_branch": "main",
|
||||
"revision": "f5979684c0e61370b8f93425f984f6ea629c6dbd",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-adguardhome-sync/f5979684c0e61370b8f93425f984f6ea629c6dbd/README.md",
|
||||
"readme_pushed_at": "2026-09-09T11:38:18Z",
|
||||
"compose_sha256": "c8d84ce623aa48c468a5bcdfc3d20298e3a41cf9091895ef5eda65db776437fa",
|
||||
"generated_at": "2026-09-12T14:37:23+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "adguardhome-sync",
|
||||
"container_name": "adguardhome-sync",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/adguardhome-sync:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/adguardhome-sync",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "CONFIGFILE",
|
||||
"example": "/config/adguardhome-sync.yaml",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/adguardhome-sync/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": 8080,
|
||||
"published_example": 8080,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n adguardhome-sync:\n image: lscr.io/linuxserver/adguardhome-sync:latest\n container_name: adguardhome-sync\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n - CONFIGFILE=/config/adguardhome-sync.yaml #optional\n volumes:\n - /path/to/adguardhome-sync/config:/config\n ports:\n - 8080:8080\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 8080,
|
||||
"path": "/",
|
||||
"source": "compose-first-tcp-port-fallback"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "passed-amd64",
|
||||
"service_health": "passed-amd64",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,360 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-adminer",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Adminer"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Database management in a single PHP file"
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Adminer (formerly phpMinAdmin) is a full-featured database management tool written in PHP. Conversely to phpMyAdmin, it consist of a single file ready to deploy to the target server. Adminer is available for MySQL, PostgreSQL, SQLite, MS SQL, Oracle, Firebird, SimpleDB, Elasticsearch and MongoDB."
|
||||
},
|
||||
"category": "ai",
|
||||
"category_label": "AI / Coding & Dev-Tools",
|
||||
"author": "Jakub Vr\u00e1na",
|
||||
"developer": "Jakub Vr\u00e1na",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 8080,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://www.adminer.org",
|
||||
"documentation": null,
|
||||
"repository": "https://hub.docker.com/_/adminer",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "official",
|
||||
"repository": "https://hub.docker.com/_/adminer",
|
||||
"revision": "6c8ba52b744a2eccfafdf13e5e6bd0bd7c35423bcc033b0ffb122d90f39766e6",
|
||||
"image_repository_url": "https://hub.docker.com/_/adminer",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "6c8ba52b744a2eccfafdf13e5e6bd0bd7c35423bcc033b0ffb122d90f39766e6",
|
||||
"generated_at": "2026-09-13T15:34:57+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "adminer",
|
||||
"container_name": "adminer",
|
||||
"image": {
|
||||
"reference": "adminer:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "adminer",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [],
|
||||
"volumes": [],
|
||||
"ports": [
|
||||
{
|
||||
"container_port": 8080,
|
||||
"published_example": 8080,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "name: adminer\nservices:\n adminer:\n image: adminer:latest\n deploy:\n resources:\n reservations:\n memory: 32M\n restart: unless-stopped\n ports:\n - 8080:8080\n container_name: adminer\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "adminer",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "adminer",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "adminer",
|
||||
"image": "adminer:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"image": "adminer:latest",
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "32M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"restart": "unless-stopped",
|
||||
"ports": [
|
||||
"8080:8080"
|
||||
],
|
||||
"container_name": "adminer"
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "adminer"
|
||||
},
|
||||
"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": [
|
||||
"adminer"
|
||||
],
|
||||
"stop_order": [
|
||||
"adminer"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 8080,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"credentials": []
|
||||
},
|
||||
"proxmox": {
|
||||
"runtime": "native-oci-lxc",
|
||||
"technology_status": "proxmox-technology-preview",
|
||||
"defaults": {
|
||||
"unprivileged": true,
|
||||
"ostype": "auto-from-image",
|
||||
"cores": 2,
|
||||
"memory_mb": 128,
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"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,431 @@
|
||||
{
|
||||
"schema_version": "0.4.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-airsonic-advanced",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Airsonic Advanced"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Airsonic-advanced is a free, web-based media streamer, providing ubiquitious access to your music. Use it to share your music with friends, or to listen to your own music while at work. You can stream to multiple players simultaneously, for instance to one player in your kitchen and another in your living room."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Airsonic-advanced is a free, web-based media streamer, providing ubiquitious access to your music. Use it to share your music with friends, or to listen to your own music while at work. You can stream to multiple players simultaneously, for instance to one player in your kitchen and another in your living room."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/airsonic-advanced-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/airsonic-advanced-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 4040,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://github.com/kagemomiji/airsonic-advanced",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-airsonic-advanced/",
|
||||
"repository": "https://github.com/linuxserver/docker-airsonic-advanced",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2024-12-21",
|
||||
"note": "Rebase to Alpine 3.21. Switch upstream to track https://github.com/kagemomiji/airsonic-advanced."
|
||||
},
|
||||
{
|
||||
"date": "2024-05-24",
|
||||
"note": "Rebase to Alpine 3.20."
|
||||
},
|
||||
{
|
||||
"date": "2024-03-20",
|
||||
"note": "Rebase to Alpine 3.19."
|
||||
},
|
||||
{
|
||||
"date": "2023-05-30",
|
||||
"note": "Rebase to Alpine 3.18."
|
||||
},
|
||||
{
|
||||
"date": "2023-02-11",
|
||||
"note": "Rebase to Alpine 3.17."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2024-12-21"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-airsonic-advanced",
|
||||
"default_branch": "master",
|
||||
"revision": "6f1c44cca22385d01b5f95eae6fb34e48bbcd6db",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-airsonic-advanced/6f1c44cca22385d01b5f95eae6fb34e48bbcd6db/README.md",
|
||||
"readme_pushed_at": "2026-09-12T12:53:04Z",
|
||||
"compose_sha256": "00bd8daac79ebd1b2d47b34c2e8c5917bd8631116e61e320c057eee69de42931",
|
||||
"generated_at": "2026-09-13T15:35:39+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "airsonic-advanced",
|
||||
"container_name": "airsonic-advanced",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/airsonic-advanced:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/airsonic-advanced",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "CONTEXT_PATH",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "JAVA_OPTS",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/airsonic-advanced/config",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 4
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-1",
|
||||
"container_path": "/music",
|
||||
"compose_source_example": "/path/to/music",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-2",
|
||||
"container_path": "/playlists",
|
||||
"compose_source_example": "/path/to/playlists",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-3",
|
||||
"container_path": "/podcasts",
|
||||
"compose_source_example": "/path/to/podcasts",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-4",
|
||||
"container_path": "/media",
|
||||
"compose_source_example": "/path/to/other media",
|
||||
"read_only": false,
|
||||
"required": false,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind",
|
||||
"skip"
|
||||
],
|
||||
"default": "skip",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
}
|
||||
],
|
||||
"ports": [
|
||||
{
|
||||
"container_port": 4040,
|
||||
"published_example": 4040,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n airsonic-advanced:\n image: lscr.io/linuxserver/airsonic-advanced:latest\n container_name: airsonic-advanced\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n - CONTEXT_PATH= #optional\n - JAVA_OPTS= #optional\n volumes:\n - /path/to/airsonic-advanced/config:/config\n - /path/to/music:/music\n - /path/to/playlists:/playlists\n - /path/to/podcasts:/podcasts\n - /path/to/other media:/media #optional\n ports:\n - 4040:4040\n devices:\n - /dev/snd:/dev/snd #optional\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 4040,
|
||||
"path": "/",
|
||||
"source": "compose-first-tcp-port-fallback"
|
||||
}
|
||||
],
|
||||
"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"
|
||||
},
|
||||
"installer_profile": {
|
||||
"device_requests": [
|
||||
{
|
||||
"id": "dev-snd",
|
||||
"kind": "character-device-tree",
|
||||
"purpose": "audio",
|
||||
"enable_prompt": "Host audio devices",
|
||||
"enabled_default": false,
|
||||
"required_by_compose": false,
|
||||
"path_prompt": "Audio device directory",
|
||||
"host_path_default": "/dev/snd",
|
||||
"container_path": "/dev/snd",
|
||||
"mode": "preserve-host",
|
||||
"deny_write": false,
|
||||
"gid_strategy": "host-device-gid",
|
||||
"source_mapping": "/dev/snd:/dev/snd"
|
||||
}
|
||||
]
|
||||
},
|
||||
"adaptations": [
|
||||
{
|
||||
"id": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-command",
|
||||
"upstream_behavior": "Compose replaces the image Cmd while retaining its Entrypoint.",
|
||||
"native_lxc_behavior": "ProxMenux reads the official OCI Entrypoint and combines it with the Compose command as the native LXC init command.",
|
||||
"reason": "Proxmox stores the effective OCI process as one entrypoint string.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-process-runtime",
|
||||
"upstream_behavior": "Compose can replace Entrypoint, User and WorkingDir and request an init process or interactive terminal.",
|
||||
"native_lxc_behavior": "ProxMenux applies the process overrides through native LXC init directives; lxc-init provides PID 1 supervision and the CT console provides terminal access.",
|
||||
"reason": "The OCI process must start with the same identity, command and working directory without Docker.",
|
||||
"behavioral_impact": "Compose stdin_open and tty become access through the Proxmox LXC console.",
|
||||
"validation": "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-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": "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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"user",
|
||||
"volumes",
|
||||
"working_dir"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,463 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-albyhub",
|
||||
"status": "laboratory-validated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Alby Hub \u2728"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Self-custodial Bitcoin Lightning wallet with integrated node and app connections."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Alby Hub is an open-source, self-custodial Bitcoin Lightning wallet, with the easiest-to-use Lightning Network node for everyone.\nWhether you're an individual, creator, or developer, Alby Hub is your centre for seamless Bitcoin payments.\nEffortlessly connect to a variety of apps like the Alby Browser Extension or Alby Go mobile app, create sub-wallets for family and friends, and take full control of your funds\u2014all within an intuitive interface and developer-ready APIs.\n\n**USEFUL LINKS**\n- [Source Repository](https://github.com/getAlby/hub)\n- [Support](https://support.getalby.com/)\n- [Marketing Site](https://albyhub.com/)\n- [Community of users and developers](https://discord.getalby.com)\n- [Feedback Board, feature requests, bug reports[(https://feedback.getalby.com)\n"
|
||||
},
|
||||
"category": "finance",
|
||||
"category_label": "Finance & Budgeting",
|
||||
"author": "getalby",
|
||||
"developer": null,
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 8080,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://albyhub.com/",
|
||||
"documentation": null,
|
||||
"repository": "https://ghcr.io/getalby/hub",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "getalby",
|
||||
"repository": "https://ghcr.io/getalby/hub",
|
||||
"revision": "146ef47a306af88e45232c40da9d35e293b48de644664cf85de6c0ae2ad97ef1",
|
||||
"image_repository_url": "https://ghcr.io/getalby/hub",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "146ef47a306af88e45232c40da9d35e293b48de644664cf85de6c0ae2ad97ef1",
|
||||
"generated_at": "2026-09-13T15:34:57+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "albyhub",
|
||||
"container_name": "albyhub",
|
||||
"image": {
|
||||
"reference": "ghcr.io/getalby/hub:latest",
|
||||
"registry": "ghcr.io",
|
||||
"repository": "ghcr.io/getalby/hub",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "$PGID",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "$PUID",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "$TZ",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "UMASK",
|
||||
"example": "002",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "WORK_DIR",
|
||||
"example": "/data/albyhub",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "LOG_EVENTS",
|
||||
"example": "True",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/data",
|
||||
"compose_source_example": "/DATA/AppData/$AppID/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": 8080,
|
||||
"published_example": 58000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "on-failure",
|
||||
"stop_grace_period": "1m",
|
||||
"original_compose": "name: albyhub\nservices:\n albyhub:\n environment:\n PGID: $PGID\n PUID: $PUID\n TZ: $TZ\n UMASK: '002'\n WORK_DIR: /data/albyhub\n LOG_EVENTS: true\n command: []\n container_name: albyhub\n image: ghcr.io/getalby/hub:latest\n deploy:\n resources:\n reservations:\n memory: 1024M\n labels:\n icon: https://cdn.jsdelivr.net/gh/getAlby/hub@master/frontend/public/icon-512.png\n ports:\n - target: 8080\n published: '58000'\n protocol: tcp\n restart: on-failure\n stop_grace_period: 1m\n volumes:\n - type: bind\n source: /DATA/AppData/$AppID/data\n target: /data\n network_mode: bridge\n privileged: false\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "albyhub",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "albyhub",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "albyhub",
|
||||
"image": "ghcr.io/getalby/hub:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"environment": {
|
||||
"PGID": "$PGID",
|
||||
"PUID": "$PUID",
|
||||
"TZ": "$TZ",
|
||||
"UMASK": "002",
|
||||
"WORK_DIR": "/data/albyhub",
|
||||
"LOG_EVENTS": true
|
||||
},
|
||||
"command": [],
|
||||
"container_name": "albyhub",
|
||||
"image": "ghcr.io/getalby/hub:latest",
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "1024M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"labels": {
|
||||
"icon": "https://cdn.jsdelivr.net/gh/getAlby/hub@master/frontend/public/icon-512.png"
|
||||
},
|
||||
"ports": [
|
||||
{
|
||||
"target": 8080,
|
||||
"published": "58000",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"restart": "on-failure",
|
||||
"stop_grace_period": "1m",
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/data",
|
||||
"target": "/data"
|
||||
}
|
||||
],
|
||||
"network_mode": "bridge",
|
||||
"privileged": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "albyhub"
|
||||
},
|
||||
"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": "albyhub-volume-0",
|
||||
"service": "albyhub",
|
||||
"container_path": "/data",
|
||||
"mode": "host-bind",
|
||||
"user_selectable": true,
|
||||
"backup": false,
|
||||
"shared_with_other_lxc": true,
|
||||
"source_path": null,
|
||||
"source_path_prompt": "Host directory for albyhub:/data"
|
||||
}
|
||||
],
|
||||
"orchestration": {
|
||||
"reserve_vmids_atomically": 1,
|
||||
"start_order": [
|
||||
"albyhub"
|
||||
],
|
||||
"stop_order": [
|
||||
"albyhub"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 8080,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"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": 60
|
||||
},
|
||||
"image_metadata_policy": {
|
||||
"entrypoint": "import-from-oci-image",
|
||||
"cmd": "import-from-oci-image",
|
||||
"environment": "import-image-env-then-apply-compose-overrides",
|
||||
"user": "import-from-oci-image",
|
||||
"working_dir": "import-from-oci-image",
|
||||
"stop_signal": "import-from-oci-image"
|
||||
},
|
||||
"installer_profile": {
|
||||
"runtime": {
|
||||
"command": []
|
||||
}
|
||||
},
|
||||
"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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-privileged-mode",
|
||||
"upstream_behavior": "Compose selects whether the container runs in privileged mode.",
|
||||
"native_lxc_behavior": "ProxMenux uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"user",
|
||||
"volumes",
|
||||
"working_dir"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "Single-image definitions are installable when every declared Compose option has a native Proxmox translation. Multi-image and unsupported runtime features remain blocked until their orchestrator or mapping is available."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "passed-amd64",
|
||||
"service_health": "passed-amd64",
|
||||
"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,400 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-alist-sync",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Alist-Sync"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "An Alist storage synchronization tool based on the Web interface."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Alist-Sync is a storage synchronization tool based on the Web interface. It can achieve data synchronization and mutual backup among multiple network disks, and also has practical functions such as multi-task management, scheduled synchronization and difference handling.\n"
|
||||
},
|
||||
"category": "productivity",
|
||||
"category_label": "Productivity & Workflows",
|
||||
"author": "xjxjin",
|
||||
"developer": "xjxjin",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 52441,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "",
|
||||
"documentation": null,
|
||||
"repository": "https://hub.docker.com/r/xjxjin/alist-sync",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "xjxjin",
|
||||
"repository": "https://hub.docker.com/r/xjxjin/alist-sync",
|
||||
"revision": "d618977fd6400e8a25474aa77fae63474e399b77d0d55aaf8d76ec752572b771",
|
||||
"image_repository_url": "https://hub.docker.com/r/xjxjin/alist-sync",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "d618977fd6400e8a25474aa77fae63474e399b77d0d55aaf8d76ec752572b771",
|
||||
"generated_at": "2026-09-13T15:34:57+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "alist-sync",
|
||||
"container_name": "alist-sync",
|
||||
"image": {
|
||||
"reference": "xjxjin/alist-sync:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "xjxjin/alist-sync",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Asia/Shanghai",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/app/data",
|
||||
"compose_source_example": "/DATA/AppData/$AppID/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": 52441,
|
||||
"published_example": 52441,
|
||||
"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: alist-sync\nservices:\n alist-sync:\n image: xjxjin/alist-sync:latest\n container_name: alist-sync\n restart: unless-stopped\n ports:\n - 52441:52441\n volumes:\n - type: bind\n source: /DATA/AppData/$AppID/data\n target: /app/data\n environment:\n - TZ=Asia/Shanghai\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "alist-sync",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "alist-sync",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "alist-sync",
|
||||
"image": "xjxjin/alist-sync:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"image": "xjxjin/alist-sync:latest",
|
||||
"container_name": "alist-sync",
|
||||
"restart": "unless-stopped",
|
||||
"ports": [
|
||||
"52441:52441"
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/data",
|
||||
"target": "/app/data"
|
||||
}
|
||||
],
|
||||
"environment": [
|
||||
"TZ=Asia/Shanghai"
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "alist-sync"
|
||||
},
|
||||
"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": "alist-sync-volume-0",
|
||||
"service": "alist-sync",
|
||||
"container_path": "/app/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": [
|
||||
"alist-sync"
|
||||
],
|
||||
"stop_order": [
|
||||
"alist-sync"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 52441,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"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,401 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-alist",
|
||||
"status": "laboratory-validated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Alist"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Mount your cloud drive on your home NAS"
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Alist transforms how you manage and access your files at home, whether on your TV, phone, or any other device. Unlike traditional cloud storage, Alist offers a unified experience across multiple platforms, making it a breeze to keep your media and documents at your fingertips.\n\nWith features like easy installation, support for multiple storage providers (local, Aliyundrive, Onedrive, Google Drive), WebDAV support, dark mode, protected routes with password authentication, file previews for videos, audio, office files, PDFs, code, images, package and batch downloads, single sign-on, offline torrent downloads, file encryption, and additional tools like a text editor and Cloudflare workers proxy, Alist ensures a seamless and secure file management experience.\n\nDeploying Alist on private cloud devices like self-hosted server brings unmatched convenience with multi-device access, ensuring your files are always within reach and secure, no matter where you are.\n"
|
||||
},
|
||||
"category": "productivity",
|
||||
"category_label": "Productivity & Workflows",
|
||||
"author": "Xhofe",
|
||||
"developer": "Xhofe",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 5244,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://alistgo.com/",
|
||||
"documentation": null,
|
||||
"repository": "https://hub.docker.com/r/xhofe/alist",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "xhofe",
|
||||
"repository": "https://hub.docker.com/r/xhofe/alist",
|
||||
"revision": "fd43f0109fc409601d387e19033e2a96bcb6721e679aecddf551963c77585526",
|
||||
"image_repository_url": "https://hub.docker.com/r/xhofe/alist",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "fd43f0109fc409601d387e19033e2a96bcb6721e679aecddf551963c77585526",
|
||||
"generated_at": "2026-09-13T15:34:57+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "alist",
|
||||
"container_name": "alist",
|
||||
"image": {
|
||||
"reference": "xhofe/alist:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "xhofe/alist",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/opt/alist/data",
|
||||
"compose_source_example": "/DATA/AppData/$AppID/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": 5244,
|
||||
"published_example": 5244,
|
||||
"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: alist\nservices:\n alist:\n image: xhofe/alist:latest\n deploy:\n resources:\n reservations:\n memory: 64M\n network_mode: bridge\n ports:\n - target: 5244\n published: '5244'\n protocol: tcp\n restart: unless-stopped\n volumes:\n - type: bind\n source: /DATA/AppData/$AppID/data\n target: /opt/alist/data\n container_name: alist\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "alist",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "alist",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "alist",
|
||||
"image": "xhofe/alist:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"image": "xhofe/alist:latest",
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "64M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"network_mode": "bridge",
|
||||
"ports": [
|
||||
{
|
||||
"target": 5244,
|
||||
"published": "5244",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"restart": "unless-stopped",
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/data",
|
||||
"target": "/opt/alist/data"
|
||||
}
|
||||
],
|
||||
"container_name": "alist"
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "alist"
|
||||
},
|
||||
"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": "alist-volume-0",
|
||||
"service": "alist",
|
||||
"container_path": "/opt/alist/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": [
|
||||
"alist"
|
||||
],
|
||||
"stop_order": [
|
||||
"alist"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 5244,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"credentials": []
|
||||
},
|
||||
"proxmox": {
|
||||
"runtime": "native-oci-lxc",
|
||||
"technology_status": "proxmox-technology-preview",
|
||||
"defaults": {
|
||||
"unprivileged": true,
|
||||
"ostype": "auto-from-image",
|
||||
"cores": 2,
|
||||
"memory_mb": 128,
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"user",
|
||||
"volumes",
|
||||
"working_dir"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "Single-image definitions are installable when every declared Compose option has a native Proxmox translation. Multi-image and unsupported runtime features remain blocked until their orchestrator or mapping is available."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "passed-amd64",
|
||||
"service_health": "passed-amd64",
|
||||
"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,373 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-altus",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Altus"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Altus is an Electron-based WhatsApp client with themes and multiple account support."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Altus is an Electron-based WhatsApp client with themes and multiple account support."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/altus-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/altus-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://github.com/amanharwara/altus",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-altus/",
|
||||
"repository": "https://github.com/linuxserver/docker-altus",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-04-03",
|
||||
"note": "Make Wayland default disable with PIXELFLUX_WAYLAND=false."
|
||||
},
|
||||
{
|
||||
"date": "2026-03-21",
|
||||
"note": "Use Wayland ozone platform fixes scaling and acceleration."
|
||||
},
|
||||
{
|
||||
"date": "2025-12-28",
|
||||
"note": "Add Wayland init logic."
|
||||
},
|
||||
{
|
||||
"date": "2025-09-22",
|
||||
"note": "Rebase to Debian Trixie."
|
||||
},
|
||||
{
|
||||
"date": "2025-07-12",
|
||||
"note": "Rebase to Selkies, HTTPS IS NOW REQUIRED."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-04-03"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-altus",
|
||||
"default_branch": "master",
|
||||
"revision": "20affcb2e851b1243d54e496be9b97544dec2114",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-altus/20affcb2e851b1243d54e496be9b97544dec2114/README.md",
|
||||
"readme_pushed_at": "2026-09-12T08:16:57Z",
|
||||
"compose_sha256": "9f6f18c489939a4c28dc2d9027f13a9b00941765c0cb116600391eb2533af2f9",
|
||||
"generated_at": "2026-09-12T14:37:23+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "altus",
|
||||
"container_name": "altus",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/altus:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/altus",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "LC_ALL",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "upstream-documentation",
|
||||
"prompt": "Language/locale (e.g. es_ES.UTF-8; translation of every application is not guaranteed)"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/altus/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": 3000,
|
||||
"published_example": 3000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 3001,
|
||||
"published_example": 3001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n altus:\n image: lscr.io/linuxserver/altus:latest\n container_name: altus\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/altus/config:/config\n ports:\n - 3000:3000\n - 3001:3001\n shm_size: \"1gb\"\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
}
|
||||
],
|
||||
"installer_profile": {
|
||||
"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"
|
||||
]
|
||||
},
|
||||
{
|
||||
"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"
|
||||
]
|
||||
}
|
||||
],
|
||||
"selkies": {
|
||||
"base": "FROM ghcr.io/linuxserver/baseimage-selkies:debiantrixie",
|
||||
"dockerfile_url": "https://raw.githubusercontent.com/linuxserver/docker-altus/master/Dockerfile",
|
||||
"dockerfile_sha256": "c6e3ffa939d03cece6f29c8d30127ca78ec10c67840d714042f725c09b82f701",
|
||||
"reviewed_on": "2026-09-16",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/",
|
||||
"nvidia": "not-offered-until-specific-host-and-image-validation",
|
||||
"validation": "profile-generated; real streaming workload pending"
|
||||
},
|
||||
"optional_devices": [],
|
||||
"hardware_acceleration": {
|
||||
"prompt": "Selkies desktop and streaming acceleration",
|
||||
"default": "none",
|
||||
"profiles": [
|
||||
{
|
||||
"id": "none",
|
||||
"label": "No GPU (CPU)",
|
||||
"device_requests": [],
|
||||
"environment": [
|
||||
{
|
||||
"name": "AUTO_GPU",
|
||||
"value": "false"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "vaapi",
|
||||
"label": "Intel/AMD (streaming rendering and encoding)",
|
||||
"device_requests": [
|
||||
{
|
||||
"id": "selkies-render",
|
||||
"kind": "character-device",
|
||||
"path_prompt": "Intel/AMD render node",
|
||||
"host_path_default": "/dev/dri/renderD128",
|
||||
"container_path_strategy": "same-as-host",
|
||||
"mode": "0660",
|
||||
"deny_write": false,
|
||||
"gid_strategy": "host-device-gid",
|
||||
"drm_vendor_ids": [
|
||||
"0x8086",
|
||||
"0x1002"
|
||||
]
|
||||
}
|
||||
],
|
||||
"environment": [
|
||||
{
|
||||
"name": "PIXELFLUX_WAYLAND",
|
||||
"value": "true"
|
||||
},
|
||||
{
|
||||
"name": "AUTO_GPU",
|
||||
"value": "false"
|
||||
}
|
||||
],
|
||||
"environment_from_devices": {
|
||||
"DRINODE": [
|
||||
"selkies-render"
|
||||
],
|
||||
"DRI_NODE": [
|
||||
"selkies-render"
|
||||
],
|
||||
"ATTACHED_DEVICES_PERMS": [
|
||||
"selkies-render"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"gpu_validation": {
|
||||
"device_inventory": "host-sysfs-and-stat",
|
||||
"application_acceleration": "requires-workload-test",
|
||||
"tone_mapping": "not-implied-by-device-access"
|
||||
},
|
||||
"device_permissions": {
|
||||
"strategy": "linuxserver-native-init",
|
||||
"service_user": "abc",
|
||||
"environment": "ATTACHED_DEVICES_PERMS",
|
||||
"paths": "all-resolved-selected-character-devices"
|
||||
}
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"shm_size",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,465 @@
|
||||
{
|
||||
"schema_version": "0.4.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-amule",
|
||||
"status": "laboratory-validated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "aMule"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "aMule is a multi-platform client for the ED2K file sharing network and based on the windows client eMule. aMule started in August 2003, as a fork of xMule, which is a fork of lMule."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "aMule is a multi-platform client for the ED2K file sharing network and based on the windows client eMule. aMule started in August 2003, as a fork of xMule, which is a fork of lMule."
|
||||
},
|
||||
"category": "downloads",
|
||||
"category_label": "Files & Downloads",
|
||||
"author": "ngosang",
|
||||
"developer": "ngosang",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 4711,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://github.com/amule-org/amule",
|
||||
"documentation": "https://github.com/ngosang/docker-amule",
|
||||
"repository": "https://github.com/ngosang/docker-amule",
|
||||
"tips": [
|
||||
"Configuration stays on a private managed Proxmox volume with backup enabled. Downloads may use a managed volume or an explicitly selected host directory.",
|
||||
"Completed files use /downloads/incoming; incomplete files use /downloads/temp. Keeping both under one mount preserves moves on the same filesystem.",
|
||||
"GUI_PWD and WEBUI_PWD are required upstream passwords, not built-in credentials. The web login requests no username.",
|
||||
"Optional MOD variables are upstream features, not LinuxServer mods. They are not enabled automatically by this template.",
|
||||
"Do not expose HTTP port 4711 or External Connections port 4712 directly to the Internet. Router port forwarding is a separate user action; this installer does not change the router."
|
||||
],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-09-18"
|
||||
},
|
||||
"source": {
|
||||
"provider": "ngosang",
|
||||
"repository": "https://github.com/ngosang/docker-amule",
|
||||
"default_branch": "master",
|
||||
"revision": "356d94c46b8e1d02eac35ca23875d15fc01864d8",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/ngosang/docker-amule/356d94c46b8e1d02eac35ca23875d15fc01864d8/README.md",
|
||||
"readme_pushed_at": "2026-09-18",
|
||||
"compose_sha256": "c491822b91bc3e0e8af1e63f3e3cf5f1659185688afc7d9510034924662a51e6",
|
||||
"generated_at": "2026-09-18T20:05:19+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "amule",
|
||||
"container_name": "amule",
|
||||
"image": {
|
||||
"reference": "ngosang/amule:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "ngosang/amule",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "upstream-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "upstream-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Europe/London",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "upstream-compose"
|
||||
},
|
||||
{
|
||||
"name": "GUI_PWD",
|
||||
"example": "",
|
||||
"required": true,
|
||||
"sensitive": true,
|
||||
"source": "upstream-compose",
|
||||
"prompt": "Password for aMule external connections (remote client)"
|
||||
},
|
||||
{
|
||||
"name": "WEBUI_PWD",
|
||||
"example": "",
|
||||
"required": true,
|
||||
"sensitive": true,
|
||||
"source": "upstream-compose",
|
||||
"prompt": "Password to access the aMule web interface"
|
||||
},
|
||||
{
|
||||
"name": "MOD_AUTO_RESTART_ENABLED",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "upstream-compose"
|
||||
},
|
||||
{
|
||||
"name": "MOD_AUTO_RESTART_CRON",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "upstream-compose"
|
||||
},
|
||||
{
|
||||
"name": "MOD_AUTO_SHARE_ENABLED",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "upstream-compose"
|
||||
},
|
||||
{
|
||||
"name": "MOD_AUTO_SHARE_DIRECTORIES",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "upstream-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/home/amule/.aMule",
|
||||
"compose_source_example": "<fill_amule_configuration_path>",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-1",
|
||||
"container_path": "/downloads",
|
||||
"compose_source_example": "<fill_amule_downloads_path>",
|
||||
"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": 4711,
|
||||
"published_example": 4711,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 4712,
|
||||
"published_example": 4712,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 4662,
|
||||
"published_example": 4662,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 4665,
|
||||
"published_example": 4665,
|
||||
"protocol": "udp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 4672,
|
||||
"published_example": 4672,
|
||||
"protocol": "udp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n amule:\n image: ngosang/amule\n container_name: amule\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Europe/London\n - GUI_PWD=<fill_password>\n - WEBUI_PWD=<fill_password>\n - MOD_AUTO_RESTART_ENABLED=true\n - MOD_AUTO_RESTART_CRON=0 6 * * *\n - MOD_AUTO_SHARE_ENABLED=false\n - MOD_AUTO_SHARE_DIRECTORIES=/downloads/incoming;/my_movies\n ports:\n - \"4711:4711\" # Web UI and REST API (amuleapi)\n - \"4712:4712\" # External connections (amuleapi, amulegui, amulecmd)\n - \"4662:4662\" # ED2K client-to-client TCP (required for High ID)\n - \"4665:4665/udp\" # ED2K server UDP (global searches, TCP port +3)\n - \"4672:4672/udp\" # Extended eMule protocol and Kademlia UDP\n volumes:\n - <fill_amule_configuration_path>:/home/amule/.aMule\n - <fill_amule_downloads_path>:/downloads\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 4711,
|
||||
"path": "/",
|
||||
"source": "upstream-documentation"
|
||||
}
|
||||
],
|
||||
"credentials": [
|
||||
{
|
||||
"label": "aMule WebUI (password only, no username)",
|
||||
"type": "configured-or-installer-generated",
|
||||
"username": "Not required (password only)",
|
||||
"password": null,
|
||||
"password_environment": "WEBUI_PWD",
|
||||
"change_required": false,
|
||||
"source": "https://github.com/ngosang/docker-amule"
|
||||
}
|
||||
]
|
||||
},
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-command",
|
||||
"upstream_behavior": "Compose replaces the image Cmd while retaining its Entrypoint.",
|
||||
"native_lxc_behavior": "ProxMenux reads the official OCI Entrypoint and combines it with the Compose command as the native LXC init command.",
|
||||
"reason": "Proxmox stores the effective OCI process as one entrypoint string.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-process-runtime",
|
||||
"upstream_behavior": "Compose can replace Entrypoint, User and WorkingDir and request an init process or interactive terminal.",
|
||||
"native_lxc_behavior": "ProxMenux applies the process overrides through native LXC init directives; lxc-init provides PID 1 supervision and the CT console provides terminal access.",
|
||||
"reason": "The OCI process must start with the same identity, command and working directory without Docker.",
|
||||
"behavioral_impact": "Compose stdin_open and tty become access through the Proxmox LXC console.",
|
||||
"validation": "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": {
|
||||
"network": {
|
||||
"compose_mode": "bridge"
|
||||
},
|
||||
"device_requests": [],
|
||||
"startup_healthcheck": {
|
||||
"scheme": "http",
|
||||
"port": 4711,
|
||||
"path": "/",
|
||||
"timeout_seconds": 600,
|
||||
"request_timeout_seconds": 10,
|
||||
"stability_seconds": 4,
|
||||
"verify_tls": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": true,
|
||||
"supported_compose_keys": [
|
||||
"cap_add",
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"group_add",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"mem_limit",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"security_opt",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"sysctls",
|
||||
"tty",
|
||||
"ulimits",
|
||||
"user",
|
||||
"volumes",
|
||||
"working_dir"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "Reviewed official single-image mapping. Validated on amd64: clean install, authenticated web login, same-digest recreation and interrupted-candidate recovery with managed configuration and downloads. Cross-release migration, arm64 runtime and P2P downloads not tested."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "passed-amd64",
|
||||
"service_health": "passed-amd64",
|
||||
"authenticated_login": "passed-after-recovery-amd64",
|
||||
"restart_persistence": "passed-through-recreation-amd64",
|
||||
"backup_restore": "passed-managed-configuration-and-downloads-amd64",
|
||||
"update_preserves_data": "passed-same-digest-recreation-amd64",
|
||||
"cross_release_upgrade": "not-tested",
|
||||
"p2p_download": "not-tested",
|
||||
"evidence": "docs/lab/new-images-validation-20260918.json"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,434 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-anaconda3",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Anaconda3"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Your machine learning Env work with Jupyter Lab"
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Your machine learning Env work with Jupyter Lab"
|
||||
},
|
||||
"category": "ai",
|
||||
"category_label": "AI / Coding & Dev-Tools",
|
||||
"author": "LisonEvf",
|
||||
"developer": "LisonEvf",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 8888,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://www.anaconda.com",
|
||||
"documentation": null,
|
||||
"repository": "https://hub.docker.com/r/continuumio/anaconda3",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "continuumio",
|
||||
"repository": "https://hub.docker.com/r/continuumio/anaconda3",
|
||||
"revision": "cca7243066069a6d33c7856ee6d424878e3a549edb6cdac57b1d2d4546407f80",
|
||||
"image_repository_url": "https://hub.docker.com/r/continuumio/anaconda3",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "cca7243066069a6d33c7856ee6d424878e3a549edb6cdac57b1d2d4546407f80",
|
||||
"generated_at": "2026-09-13T15:34:57+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "anaconda3",
|
||||
"container_name": "anaconda3",
|
||||
"image": {
|
||||
"reference": "continuumio/anaconda3:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "continuumio/anaconda3",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "LANG",
|
||||
"example": "C.UTF-8",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "LC_ALL",
|
||||
"example": "C.UTF-8",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "PATH",
|
||||
"example": "/opt/conda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/opt/notebooks",
|
||||
"compose_source_example": "/DATA/AppData/$AppID/notebooks",
|
||||
"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": 8888,
|
||||
"published_example": 8888,
|
||||
"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: anaconda3\nservices:\n anaconda3:\n container_name: anaconda3\n image: continuumio/anaconda3:latest\n network_mode: bridge\n restart: unless-stopped\n environment:\n - LANG=C.UTF-8\n - LC_ALL=C.UTF-8\n - PATH=/opt/conda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\n ports:\n - target: 8888\n published: '8888'\n protocol: tcp\n volumes:\n - type: bind\n source: /DATA/AppData/$AppID/notebooks\n target: /opt/notebooks\n command:\n - /bin/bash\n - -c\n - conda install -c conda-forge jupyterlab -y --quiet && jupyter lab --notebook-dir=/opt/notebooks\n --ip='*' --port=8888 --no-browser --allow-root\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "anaconda3",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "anaconda3",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "anaconda3",
|
||||
"image": "continuumio/anaconda3:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"container_name": "anaconda3",
|
||||
"image": "continuumio/anaconda3:latest",
|
||||
"network_mode": "bridge",
|
||||
"restart": "unless-stopped",
|
||||
"environment": [
|
||||
"LANG=C.UTF-8",
|
||||
"LC_ALL=C.UTF-8",
|
||||
"PATH=/opt/conda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
|
||||
],
|
||||
"ports": [
|
||||
{
|
||||
"target": 8888,
|
||||
"published": "8888",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/notebooks",
|
||||
"target": "/opt/notebooks"
|
||||
}
|
||||
],
|
||||
"command": [
|
||||
"/bin/bash",
|
||||
"-c",
|
||||
"conda install -c conda-forge jupyterlab -y --quiet && jupyter lab --notebook-dir=/opt/notebooks --ip='*' --port=8888 --no-browser --allow-root"
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "anaconda3"
|
||||
},
|
||||
"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": "anaconda3-volume-0",
|
||||
"service": "anaconda3",
|
||||
"container_path": "/opt/notebooks",
|
||||
"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": [
|
||||
"anaconda3"
|
||||
],
|
||||
"stop_order": [
|
||||
"anaconda3"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 8888,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"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"
|
||||
},
|
||||
"installer_profile": {
|
||||
"runtime": {
|
||||
"command": [
|
||||
"/bin/bash",
|
||||
"-c",
|
||||
"conda install -c conda-forge jupyterlab -y --quiet && jupyter lab --notebook-dir=/opt/notebooks --ip='*' --port=8888 --no-browser --allow-root"
|
||||
]
|
||||
}
|
||||
},
|
||||
"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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-privileged-mode",
|
||||
"upstream_behavior": "Compose selects whether the container runs in privileged mode.",
|
||||
"native_lxc_behavior": "ProxMenux uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"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,441 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-anythingllm",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "AnythingLLM"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "The all-in-one AI application."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "AnythingLLM is the easiest to use, all-in-one AI application that can do RAG, AI Agents, and much more with no code or infrastructure headaches."
|
||||
},
|
||||
"category": "ai",
|
||||
"category_label": "AI / Coding & Dev-Tools",
|
||||
"author": "Mintplex Labs",
|
||||
"developer": "Mintplex Labs",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 3001,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://anythingllm.com",
|
||||
"documentation": null,
|
||||
"repository": "https://hub.docker.com/r/mintplexlabs/anythingllm",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "mintplexlabs",
|
||||
"repository": "https://hub.docker.com/r/mintplexlabs/anythingllm",
|
||||
"revision": "a810590b730bb60cbf75b8f76200c971f5f61cf2545aa237422d6bf4f1e55633",
|
||||
"image_repository_url": "https://hub.docker.com/r/mintplexlabs/anythingllm",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "a810590b730bb60cbf75b8f76200c971f5f61cf2545aa237422d6bf4f1e55633",
|
||||
"generated_at": "2026-09-13T15:47:45+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "anythingllm",
|
||||
"container_name": "anythingllm",
|
||||
"image": {
|
||||
"reference": "mintplexlabs/anythingllm:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "mintplexlabs/anythingllm",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "STORAGE_DIR",
|
||||
"example": "/app/server/storage",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/app/server/storage",
|
||||
"compose_source_example": "/DATA/AppData/anythingllm/storage",
|
||||
"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": 3001,
|
||||
"published_example": 3051,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "always",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "version: '3.8'\nname: anythingllm\nservices:\n anythingllm:\n image: mintplexlabs/anythingllm:latest\n container_name: anythingllm\n ports:\n - target: 3001\n published: 3051\n protocol: tcp\n cap_add:\n - SYS_ADMIN\n volumes:\n - type: bind\n source: /DATA/AppData/anythingllm/storage\n target: /app/server/storage\n environment:\n - STORAGE_DIR=/app/server/storage\n restart: always\n extra_hosts:\n - host.docker.internal:host-gateway\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "anythingllm",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "anythingllm",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "anythingllm",
|
||||
"image": "mintplexlabs/anythingllm:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"image": "mintplexlabs/anythingllm:latest",
|
||||
"container_name": "anythingllm",
|
||||
"ports": [
|
||||
{
|
||||
"target": 3001,
|
||||
"published": 3051,
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"cap_add": [
|
||||
"SYS_ADMIN"
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/anythingllm/storage",
|
||||
"target": "/app/server/storage"
|
||||
}
|
||||
],
|
||||
"environment": [
|
||||
"STORAGE_DIR=/app/server/storage"
|
||||
],
|
||||
"restart": "always",
|
||||
"extra_hosts": [
|
||||
"host.docker.internal:host-gateway"
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"version": "3.8",
|
||||
"name": "anythingllm"
|
||||
},
|
||||
"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": "anythingllm-volume-0",
|
||||
"service": "anythingllm",
|
||||
"container_path": "/app/server/storage",
|
||||
"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": [
|
||||
"anythingllm"
|
||||
],
|
||||
"stop_order": [
|
||||
"anythingllm"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 3001,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"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"
|
||||
},
|
||||
"installer_profile": {
|
||||
"extra_hosts": [
|
||||
{
|
||||
"hostname": "host.docker.internal",
|
||||
"address": "host-gateway"
|
||||
}
|
||||
],
|
||||
"security": {
|
||||
"required_capabilities": [
|
||||
"SYS_ADMIN"
|
||||
]
|
||||
}
|
||||
},
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"cap_add",
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"sysctls",
|
||||
"tty",
|
||||
"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,265 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-apprise-api",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Apprise Api"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Apprise-api Takes advantage of Apprise through your network with a user-friendly API."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Apprise-api Takes advantage of Apprise through your network with a user-friendly API."
|
||||
},
|
||||
"category": "messaging",
|
||||
"category_label": "Messaging & Queues",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/apprise-api-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/apprise-api-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 8000,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://github.com/caronc/apprise-api",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-apprise-api/",
|
||||
"repository": "https://github.com/linuxserver/docker-apprise-api",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2025-07-05",
|
||||
"note": "Rebase to Alpine 3.22."
|
||||
},
|
||||
{
|
||||
"date": "2024-12-24",
|
||||
"note": "Rebase to Alpine 3.21."
|
||||
},
|
||||
{
|
||||
"date": "2024-06-24",
|
||||
"note": "Rebase to Alpine 3.20."
|
||||
},
|
||||
{
|
||||
"date": "2023-12-23",
|
||||
"note": "Rebase to Alpine 3.19."
|
||||
},
|
||||
{
|
||||
"date": "2023-07-10",
|
||||
"note": "Rebase to Alpine 3.18."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2025-07-05"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-apprise-api",
|
||||
"default_branch": "main",
|
||||
"revision": "ea905a7e0229ebf4bc05f3189950ae580ba630bb",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-apprise-api/ea905a7e0229ebf4bc05f3189950ae580ba630bb/README.md",
|
||||
"readme_pushed_at": "2026-09-07T15:41:13Z",
|
||||
"compose_sha256": "edc366d773c0251a031d811302c84c97eb9efd9b468ee03bac804de06082dc88",
|
||||
"generated_at": "2026-09-12T14:37:23+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "apprise-api",
|
||||
"container_name": "apprise-api",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/apprise-api:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/apprise-api",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "APPRISE_ATTACH_SIZE",
|
||||
"example": "0",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/apprise-api/config",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 4
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-1",
|
||||
"container_path": "/attachments",
|
||||
"compose_source_example": "/path/to/apprise-api/attachments",
|
||||
"read_only": false,
|
||||
"required": false,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind",
|
||||
"skip"
|
||||
],
|
||||
"default": "skip",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
}
|
||||
],
|
||||
"ports": [
|
||||
{
|
||||
"container_port": 8000,
|
||||
"published_example": 8000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n apprise-api:\n image: lscr.io/linuxserver/apprise-api:latest\n container_name: apprise-api\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n - APPRISE_ATTACH_SIZE=0 #optional\n volumes:\n - /path/to/apprise-api/config:/config\n - /path/to/apprise-api/attachments:/attachments #optional\n ports:\n - 8000:8000\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 8000,
|
||||
"path": "/",
|
||||
"source": "compose-first-tcp-port-fallback"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,747 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-archivebox",
|
||||
"status": "generated-review-required",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "ArchiveBox"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Self-hosted internet archiving solution"
|
||||
},
|
||||
"description": {
|
||||
"en_US": "ArchiveBox is a powerful, self-hosted internet archiving solution that allows you to create your own personal archive of web pages, PDFs, videos, and more. It functions as a personal internet archive, saving content in multiple formats for long-term preservation.\n\nThe system consists of multiple components:\n- **ArchiveBox**: The main application providing the web interface and archiving capabilities\n- **Sonic**: A fast search backend for full-text search across archived content\n- **ArchiveBox Scheduler**: A background service for scheduled archiving tasks\n- **NoVNC**: A web-based VNC client for browser-based archiving\n\n**Key Features:**\n- Save web pages in multiple formats (HTML, PDF, screenshots, etc.)\n- Full-text search across all archived content\n- Scheduled archiving of websites and RSS feeds\n- Browser-based archiving with NoVNC\n- User authentication and access control\n- Extract and save media files (videos, audio, PDFs, etc.)\n\n**Learn More:**\n- [ArchiveBox Official Website](https://archivebox.io)\n- [ArchiveBox GitHub Repository](https://github.com/ArchiveBox/ArchiveBox)\n- [ArchiveBox Documentation](https://github.com/ArchiveBox/ArchiveBox/wiki)\n"
|
||||
},
|
||||
"category": "documents",
|
||||
"category_label": "Documents & Notes",
|
||||
"author": "ArchiveBox",
|
||||
"developer": "ArchiveBox",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 8000,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://archivebox.io",
|
||||
"documentation": null,
|
||||
"repository": "https://hub.docker.com/r/archivebox/archivebox",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null,
|
||||
"hidden": true,
|
||||
"hidden_reason": "Pending multi-container adaptation; retained for future work"
|
||||
},
|
||||
"source": {
|
||||
"provider": "official",
|
||||
"repository": "https://hub.docker.com/r/archivebox/archivebox",
|
||||
"revision": "e27286fc551a27ebc617239ccf45d9f2e741c213adeed4f9fc37df676c1cf27c",
|
||||
"image_repository_url": "https://hub.docker.com/r/archivebox/archivebox",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "e27286fc551a27ebc617239ccf45d9f2e741c213adeed4f9fc37df676c1cf27c",
|
||||
"generated_at": "2026-09-13T15:48:20+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "archivebox",
|
||||
"container_name": "archivebox",
|
||||
"image": {
|
||||
"reference": "archivebox/archivebox:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "archivebox/archivebox",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "ADMIN_USERNAME",
|
||||
"example": "archivebox",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "ADMIN_PASSWORD",
|
||||
"example": "${GENERATED_ADMIN_PASSWORD}",
|
||||
"required": true,
|
||||
"sensitive": true,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "ALLOWED_HOSTS",
|
||||
"example": "*",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "CSRF_TRUSTED_ORIGINS",
|
||||
"example": "*",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "PUBLIC_INDEX",
|
||||
"example": "True",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "PUBLIC_SNAPSHOTS",
|
||||
"example": "True",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "PUBLIC_ADD_VIEW",
|
||||
"example": "False",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "SEARCH_BACKEND_ENGINE",
|
||||
"example": "sonic",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "SEARCH_BACKEND_HOST_NAME",
|
||||
"example": "archivebox_sonic",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "SEARCH_BACKEND_PASSWORD",
|
||||
"example": "${GENERATED_SEARCH_BACKEND_PASSWORD}",
|
||||
"required": true,
|
||||
"sensitive": true,
|
||||
"source": "docker-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/data",
|
||||
"compose_source_example": "/DATA/AppData/$AppID/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": 8000,
|
||||
"published_example": 18010,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [
|
||||
{
|
||||
"name": "archivebox_scheduler",
|
||||
"image": "archivebox/archivebox:latest"
|
||||
},
|
||||
{
|
||||
"name": "archivebox_sonic",
|
||||
"image": "archivebox/sonic:latest"
|
||||
},
|
||||
{
|
||||
"name": "archivebox_novnc",
|
||||
"image": "theasp/novnc:latest"
|
||||
}
|
||||
],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "name: archivebox\nservices:\n archivebox:\n image: archivebox/archivebox:latest\n container_name: archivebox\n deploy:\n resources:\n reservations:\n memory: 128M\n restart: unless-stopped\n networks:\n - archivebox_network\n depends_on:\n - archivebox_sonic\n ports:\n - target: 8000\n published: '18010'\n protocol: tcp\n volumes:\n - type: bind\n source: /DATA/AppData/$AppID/data\n target: /data\n environment:\n - ADMIN_USERNAME=archivebox\n - ADMIN_PASSWORD=${GENERATED_ADMIN_PASSWORD}\n - ALLOWED_HOSTS=*\n - CSRF_TRUSTED_ORIGINS=*\n - PUBLIC_INDEX=True\n - PUBLIC_SNAPSHOTS=True\n - PUBLIC_ADD_VIEW=False\n - SEARCH_BACKEND_ENGINE=sonic\n - SEARCH_BACKEND_HOST_NAME=archivebox_sonic\n - SEARCH_BACKEND_PASSWORD=${GENERATED_SEARCH_BACKEND_PASSWORD}\n healthcheck:\n test:\n - CMD\n - wget\n - --no-verbose\n - --tries=1\n - --spider\n - http://localhost:8000\n interval: 1m\n timeout: 3s\n archivebox_scheduler:\n image: archivebox/archivebox:latest\n container_name: archivebox_scheduler\n deploy:\n resources:\n reservations:\n memory: 128M\n restart: unless-stopped\n networks:\n - archivebox_network\n depends_on:\n - archivebox_sonic\n command:\n - schedule\n - --foreground\n - --update\n - --every=day\n environment:\n - TIMEOUT=120\n - SEARCH_BACKEND_ENGINE=sonic\n - SEARCH_BACKEND_HOST_NAME=archivebox_sonic\n - SEARCH_BACKEND_PASSWORD=${GENERATED_SEARCH_BACKEND_PASSWORD}\n volumes:\n - type: bind\n source: /DATA/AppData/$AppID/data\n target: /data\n archivebox_sonic:\n image: archivebox/sonic:latest\n container_name: archivebox_sonic\n deploy:\n resources:\n reservations:\n memory: 128M\n restart: unless-stopped\n networks:\n - archivebox_network\n expose:\n - 1491\n environment:\n - SEARCH_BACKEND_PASSWORD=${GENERATED_SEARCH_BACKEND_PASSWORD}\n volumes:\n - type: bind\n source: /DATA/AppData/$AppID/data/sonic\n target: /var/lib/sonic/store\n archivebox_novnc:\n image: theasp/novnc:latest\n container_name: archivebox_novnc\n deploy:\n resources:\n reservations:\n memory: 128M\n restart: unless-stopped\n networks:\n - archivebox_network\n ports:\n - target: 8080\n published: '18082'\n protocol: tcp\n environment:\n - DISPLAY_WIDTH=1920\n - DISPLAY_HEIGHT=1080\n - RUN_XTERM=no\nnetworks:\n archivebox_network:\n driver: bridge\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "archivebox",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "archivebox",
|
||||
"service_count": 4,
|
||||
"services": [
|
||||
{
|
||||
"name": "archivebox_novnc",
|
||||
"image": "theasp/novnc:latest",
|
||||
"is_main": false,
|
||||
"role": "dependency",
|
||||
"vmid_offset": 1,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": true,
|
||||
"compose": {
|
||||
"image": "theasp/novnc:latest",
|
||||
"container_name": "archivebox_novnc",
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "128M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"restart": "unless-stopped",
|
||||
"networks": [
|
||||
"archivebox_network"
|
||||
],
|
||||
"ports": [
|
||||
{
|
||||
"target": 8080,
|
||||
"published": "18082",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"environment": [
|
||||
"DISPLAY_WIDTH=1920",
|
||||
"DISPLAY_HEIGHT=1080",
|
||||
"RUN_XTERM=no"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "archivebox_sonic",
|
||||
"image": "archivebox/sonic:latest",
|
||||
"is_main": false,
|
||||
"role": "dependency",
|
||||
"vmid_offset": 2,
|
||||
"depends_on": [],
|
||||
"frontend_network": false,
|
||||
"private_network": true,
|
||||
"compose": {
|
||||
"image": "archivebox/sonic:latest",
|
||||
"container_name": "archivebox_sonic",
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "128M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"restart": "unless-stopped",
|
||||
"networks": [
|
||||
"archivebox_network"
|
||||
],
|
||||
"expose": [
|
||||
1491
|
||||
],
|
||||
"environment": [
|
||||
"SEARCH_BACKEND_PASSWORD=${GENERATED_SEARCH_BACKEND_PASSWORD}"
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/data/sonic",
|
||||
"target": "/var/lib/sonic/store"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "archivebox_scheduler",
|
||||
"image": "archivebox/archivebox:latest",
|
||||
"is_main": false,
|
||||
"role": "dependency",
|
||||
"vmid_offset": 3,
|
||||
"depends_on": [
|
||||
"archivebox_sonic"
|
||||
],
|
||||
"frontend_network": false,
|
||||
"private_network": true,
|
||||
"compose": {
|
||||
"image": "archivebox/archivebox:latest",
|
||||
"container_name": "archivebox_scheduler",
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "128M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"restart": "unless-stopped",
|
||||
"networks": [
|
||||
"archivebox_network"
|
||||
],
|
||||
"depends_on": [
|
||||
"archivebox_sonic"
|
||||
],
|
||||
"command": [
|
||||
"schedule",
|
||||
"--foreground",
|
||||
"--update",
|
||||
"--every=day"
|
||||
],
|
||||
"environment": [
|
||||
"TIMEOUT=120",
|
||||
"SEARCH_BACKEND_ENGINE=sonic",
|
||||
"SEARCH_BACKEND_HOST_NAME=archivebox_sonic",
|
||||
"SEARCH_BACKEND_PASSWORD=${GENERATED_SEARCH_BACKEND_PASSWORD}"
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/data",
|
||||
"target": "/data"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "archivebox",
|
||||
"image": "archivebox/archivebox:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [
|
||||
"archivebox_sonic"
|
||||
],
|
||||
"frontend_network": true,
|
||||
"private_network": true,
|
||||
"compose": {
|
||||
"image": "archivebox/archivebox:latest",
|
||||
"container_name": "archivebox",
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "128M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"restart": "unless-stopped",
|
||||
"networks": [
|
||||
"archivebox_network"
|
||||
],
|
||||
"depends_on": [
|
||||
"archivebox_sonic"
|
||||
],
|
||||
"ports": [
|
||||
{
|
||||
"target": 8000,
|
||||
"published": "18010",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/data",
|
||||
"target": "/data"
|
||||
}
|
||||
],
|
||||
"environment": [
|
||||
"ADMIN_USERNAME=archivebox",
|
||||
"ADMIN_PASSWORD=${GENERATED_ADMIN_PASSWORD}",
|
||||
"ALLOWED_HOSTS=*",
|
||||
"CSRF_TRUSTED_ORIGINS=*",
|
||||
"PUBLIC_INDEX=True",
|
||||
"PUBLIC_SNAPSHOTS=True",
|
||||
"PUBLIC_ADD_VIEW=False",
|
||||
"SEARCH_BACKEND_ENGINE=sonic",
|
||||
"SEARCH_BACKEND_HOST_NAME=archivebox_sonic",
|
||||
"SEARCH_BACKEND_PASSWORD=${GENERATED_SEARCH_BACKEND_PASSWORD}"
|
||||
],
|
||||
"healthcheck": {
|
||||
"test": [
|
||||
"CMD",
|
||||
"wget",
|
||||
"--no-verbose",
|
||||
"--tries=1",
|
||||
"--spider",
|
||||
"http://localhost:8000"
|
||||
],
|
||||
"interval": "1m",
|
||||
"timeout": "3s"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "archivebox",
|
||||
"networks": {
|
||||
"archivebox_network": {
|
||||
"driver": "bridge"
|
||||
}
|
||||
}
|
||||
},
|
||||
"networking": {
|
||||
"frontend": "selected-proxmox-bridge",
|
||||
"private_required": true,
|
||||
"private_creation": "automatic-create-if-missing",
|
||||
"private_address_allocation": "automatic-static-address-per-service",
|
||||
"service_discovery": "private-addresses-with-compose-service-host-aliases",
|
||||
"dependency_external_access": "disabled-unless-service-publishes-ports",
|
||||
"prompt_user_for_private_network": false
|
||||
},
|
||||
"storage": [
|
||||
{
|
||||
"id": "archivebox-volume-0",
|
||||
"service": "archivebox",
|
||||
"container_path": "/data",
|
||||
"mode": "host-bind",
|
||||
"user_selectable": true,
|
||||
"backup": false,
|
||||
"shared_with_other_lxc": true,
|
||||
"source_path": null,
|
||||
"source_path_prompt": "Host directory for archivebox:/data"
|
||||
},
|
||||
{
|
||||
"id": "archivebox-scheduler-volume-0",
|
||||
"service": "archivebox_scheduler",
|
||||
"container_path": "/data",
|
||||
"mode": "host-bind",
|
||||
"user_selectable": true,
|
||||
"backup": false,
|
||||
"shared_with_other_lxc": true,
|
||||
"source_path": null,
|
||||
"source_path_prompt": "Host directory for archivebox_scheduler:/data"
|
||||
},
|
||||
{
|
||||
"id": "archivebox-sonic-volume-0",
|
||||
"service": "archivebox_sonic",
|
||||
"container_path": "/var/lib/sonic/store",
|
||||
"mode": "managed-volume",
|
||||
"user_selectable": false,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"source_path": null,
|
||||
"source_path_prompt": null
|
||||
}
|
||||
],
|
||||
"orchestration": {
|
||||
"reserve_vmids_atomically": 4,
|
||||
"start_order": [
|
||||
"archivebox_novnc",
|
||||
"archivebox_sonic",
|
||||
"archivebox_scheduler",
|
||||
"archivebox"
|
||||
],
|
||||
"stop_order": [
|
||||
"archivebox",
|
||||
"archivebox_scheduler",
|
||||
"archivebox_sonic",
|
||||
"archivebox_novnc"
|
||||
],
|
||||
"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": "admin-password",
|
||||
"strategy": "generate-cryptographically-random-at-install",
|
||||
"bindings": [
|
||||
{
|
||||
"service": "archivebox",
|
||||
"environment_variable": "ADMIN_PASSWORD"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "search-backend-password",
|
||||
"strategy": "generate-cryptographically-random-at-install",
|
||||
"bindings": [
|
||||
{
|
||||
"service": "archivebox",
|
||||
"environment_variable": "SEARCH_BACKEND_PASSWORD"
|
||||
},
|
||||
{
|
||||
"service": "archivebox_scheduler",
|
||||
"environment_variable": "SEARCH_BACKEND_PASSWORD"
|
||||
},
|
||||
{
|
||||
"service": "archivebox_sonic",
|
||||
"environment_variable": "SEARCH_BACKEND_PASSWORD"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 8000,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"credentials": []
|
||||
},
|
||||
"proxmox": {
|
||||
"runtime": "native-oci-lxc",
|
||||
"technology_status": "proxmox-technology-preview",
|
||||
"defaults": {
|
||||
"unprivileged": true,
|
||||
"ostype": "auto-from-image",
|
||||
"cores": 2,
|
||||
"memory_mb": 128,
|
||||
"swap_mb": 512,
|
||||
"rootfs_size_gb": 8,
|
||||
"rootfs_storage": "local-lvm",
|
||||
"volume_storage": "local-lvm",
|
||||
"template_storage": "local",
|
||||
"bridge": "vmbr0",
|
||||
"ipv4": "dhcp",
|
||||
"firewall": true,
|
||||
"host_managed_network": true,
|
||||
"onboot": false,
|
||||
"features": [
|
||||
"nesting=1"
|
||||
],
|
||||
"shutdown_timeout_seconds": 30
|
||||
},
|
||||
"image_metadata_policy": {
|
||||
"entrypoint": "import-from-oci-image",
|
||||
"cmd": "import-from-oci-image",
|
||||
"environment": "import-image-env-then-apply-compose-overrides",
|
||||
"user": "import-from-oci-image",
|
||||
"working_dir": "import-from-oci-image",
|
||||
"stop_signal": "import-from-oci-image"
|
||||
},
|
||||
"installer_profile": {
|
||||
"startup_healthcheck": {
|
||||
"type": "http",
|
||||
"scheme": "http",
|
||||
"port": 8000,
|
||||
"path": "/",
|
||||
"timeout_seconds": 180,
|
||||
"request_timeout_seconds": 3,
|
||||
"stability_seconds": 0,
|
||||
"verify_tls": true,
|
||||
"required": true,
|
||||
"source": "compose-healthcheck"
|
||||
}
|
||||
},
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"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-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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"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"
|
||||
}
|
||||
],
|
||||
"generic_stack_review": [
|
||||
"archivebox_novnc: perfil de salud y persistencia pendiente",
|
||||
"archivebox_scheduler: perfil de salud y persistencia pendiente",
|
||||
"archivebox_sonic: perfil de salud y persistencia pendiente",
|
||||
"volumen compartido entre servicios pendiente"
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": false,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"cap_add",
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"sysctls",
|
||||
"tty",
|
||||
"user",
|
||||
"volumes",
|
||||
"working_dir"
|
||||
],
|
||||
"untranslated_blockers": [
|
||||
"multi-service-compose",
|
||||
"compose-key:depends_on",
|
||||
"service:archivebox_scheduler:compose-key:depends_on",
|
||||
"service:archivebox_sonic:compose-key:expose",
|
||||
"native-multi-lxc-orchestrator-not-yet-implemented"
|
||||
],
|
||||
"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,369 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-ardour",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Ardour"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Ardour is an open source, collaborative effort of a worldwide team including musicians, programmers, and professional recording engineers."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Ardour is an open source, collaborative effort of a worldwide team including musicians, programmers, and professional recording engineers."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/ardour-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/ardour-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://ardour.org/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-ardour/",
|
||||
"repository": "https://github.com/linuxserver/docker-ardour",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-04-03",
|
||||
"note": "Make Wayland default disable with PIXELFLUX_WAYLAND=false."
|
||||
},
|
||||
{
|
||||
"date": "2025-12-28",
|
||||
"note": "Add Wayland init logic."
|
||||
},
|
||||
{
|
||||
"date": "2025-07-12",
|
||||
"note": "Rebase to Selkies, HTTPS IS NOW REQUIRED."
|
||||
},
|
||||
{
|
||||
"date": "2024-04-10",
|
||||
"note": "Initial release."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-04-03"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-ardour",
|
||||
"default_branch": "master",
|
||||
"revision": "2898fb09d627ed1399438ed0bc3efc7db4d685bb",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-ardour/2898fb09d627ed1399438ed0bc3efc7db4d685bb/README.md",
|
||||
"readme_pushed_at": "2026-06-25T16:52:13Z",
|
||||
"compose_sha256": "68999431889fb890df586871ef191da31793aabfd0a9a5198f70e481dc6d672a",
|
||||
"generated_at": "2026-09-12T14:37:23+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "ardour",
|
||||
"container_name": "ardour",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/ardour:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/ardour",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "LC_ALL",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "upstream-documentation",
|
||||
"prompt": "Language/locale (e.g. es_ES.UTF-8; translation of every application is not guaranteed)"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/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": 3000,
|
||||
"published_example": 3000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 3001,
|
||||
"published_example": 3001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n ardour:\n image: lscr.io/linuxserver/ardour:latest\n container_name: ardour\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/config:/config\n ports:\n - 3000:3000\n - 3001:3001\n shm_size: \"1gb\"\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
}
|
||||
],
|
||||
"installer_profile": {
|
||||
"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"
|
||||
]
|
||||
},
|
||||
{
|
||||
"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"
|
||||
]
|
||||
}
|
||||
],
|
||||
"selkies": {
|
||||
"base": "FROM ghcr.io/linuxserver/baseimage-selkies:arch",
|
||||
"dockerfile_url": "https://raw.githubusercontent.com/linuxserver/docker-ardour/master/Dockerfile",
|
||||
"dockerfile_sha256": "9446e3b76e6b52a395a1641520f5306eae58f9b5f0d167ff3827f132af63e5b2",
|
||||
"reviewed_on": "2026-09-16",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/",
|
||||
"nvidia": "not-offered-until-specific-host-and-image-validation",
|
||||
"validation": "profile-generated; real streaming workload pending"
|
||||
},
|
||||
"optional_devices": [],
|
||||
"hardware_acceleration": {
|
||||
"prompt": "Selkies desktop and streaming acceleration",
|
||||
"default": "none",
|
||||
"profiles": [
|
||||
{
|
||||
"id": "none",
|
||||
"label": "No GPU (CPU)",
|
||||
"device_requests": [],
|
||||
"environment": [
|
||||
{
|
||||
"name": "AUTO_GPU",
|
||||
"value": "false"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "vaapi",
|
||||
"label": "Intel/AMD (streaming rendering and encoding)",
|
||||
"device_requests": [
|
||||
{
|
||||
"id": "selkies-render",
|
||||
"kind": "character-device",
|
||||
"path_prompt": "Intel/AMD render node",
|
||||
"host_path_default": "/dev/dri/renderD128",
|
||||
"container_path_strategy": "same-as-host",
|
||||
"mode": "0660",
|
||||
"deny_write": false,
|
||||
"gid_strategy": "host-device-gid",
|
||||
"drm_vendor_ids": [
|
||||
"0x8086",
|
||||
"0x1002"
|
||||
]
|
||||
}
|
||||
],
|
||||
"environment": [
|
||||
{
|
||||
"name": "PIXELFLUX_WAYLAND",
|
||||
"value": "true"
|
||||
},
|
||||
{
|
||||
"name": "AUTO_GPU",
|
||||
"value": "false"
|
||||
}
|
||||
],
|
||||
"environment_from_devices": {
|
||||
"DRINODE": [
|
||||
"selkies-render"
|
||||
],
|
||||
"DRI_NODE": [
|
||||
"selkies-render"
|
||||
],
|
||||
"ATTACHED_DEVICES_PERMS": [
|
||||
"selkies-render"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"gpu_validation": {
|
||||
"device_inventory": "host-sysfs-and-stat",
|
||||
"application_acceleration": "requires-workload-test",
|
||||
"tone_mapping": "not-implied-by-device-access"
|
||||
},
|
||||
"device_permissions": {
|
||||
"strategy": "linuxserver-native-init",
|
||||
"service_user": "abc",
|
||||
"environment": "ATTACHED_DEVICES_PERMS",
|
||||
"paths": "all-resolved-selected-character-devices"
|
||||
}
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"shm_size",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,372 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-audacity",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Audacity"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Audacity is an easy-to-use, multi-track audio editor and recorder. Developed by a group of volunteers as open source."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Audacity is an easy-to-use, multi-track audio editor and recorder. Developed by a group of volunteers as open source."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/audacity-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/audacity-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://www.audacityteam.org/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-audacity/",
|
||||
"repository": "https://github.com/linuxserver/docker-audacity",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-04-29",
|
||||
"note": "Rebase to resolute."
|
||||
},
|
||||
{
|
||||
"date": "2026-04-03",
|
||||
"note": "Make Wayland default disable with PIXELFLUX_WAYLAND=false."
|
||||
},
|
||||
{
|
||||
"date": "2025-12-28",
|
||||
"note": "Add Wayland init logic."
|
||||
},
|
||||
{
|
||||
"date": "2025-07-12",
|
||||
"note": "Rebase to Selkies, HTTPS IS NOW REQUIRED."
|
||||
},
|
||||
{
|
||||
"date": "2024-10-31",
|
||||
"note": "Fix artifact name."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-04-29"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-audacity",
|
||||
"default_branch": "main",
|
||||
"revision": "d4dd141287260983154a2e9e6e4371ee35962ac1",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-audacity/d4dd141287260983154a2e9e6e4371ee35962ac1/README.md",
|
||||
"readme_pushed_at": "2026-09-08T09:28:27Z",
|
||||
"compose_sha256": "b01ce49ed7c4754968665fc392170d1d917f04146fa95b9b8c61e7e7053d300b",
|
||||
"generated_at": "2026-09-12T14:37:23+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "audacity",
|
||||
"container_name": "audacity",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/audacity:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/audacity",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "LC_ALL",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "upstream-documentation",
|
||||
"prompt": "Language/locale (e.g. es_ES.UTF-8; translation of every application is not guaranteed)"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/audacity/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": 3000,
|
||||
"published_example": 3000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 3001,
|
||||
"published_example": 3001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n audacity:\n image: lscr.io/linuxserver/audacity:latest\n container_name: audacity\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/audacity/config:/config\n ports:\n - 3000:3000\n - 3001:3001\n shm_size: \"1gb\"\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
}
|
||||
],
|
||||
"installer_profile": {
|
||||
"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"
|
||||
]
|
||||
},
|
||||
{
|
||||
"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"
|
||||
]
|
||||
}
|
||||
],
|
||||
"selkies": {
|
||||
"base": "FROM ghcr.io/linuxserver/baseimage-selkies:ubunturesolute",
|
||||
"dockerfile_url": "https://raw.githubusercontent.com/linuxserver/docker-audacity/master/Dockerfile",
|
||||
"dockerfile_sha256": "3feef0cf6583765091dae20ab79c21095c9a651e9d8b0f8edd05b3154c12584f",
|
||||
"reviewed_on": "2026-09-16",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/",
|
||||
"nvidia": "not-offered-until-specific-host-and-image-validation",
|
||||
"validation": "profile-generated; real streaming workload pending"
|
||||
},
|
||||
"optional_devices": [],
|
||||
"hardware_acceleration": {
|
||||
"prompt": "Selkies desktop and streaming acceleration",
|
||||
"default": "none",
|
||||
"profiles": [
|
||||
{
|
||||
"id": "none",
|
||||
"label": "No GPU (CPU)",
|
||||
"device_requests": [],
|
||||
"environment": [
|
||||
{
|
||||
"name": "AUTO_GPU",
|
||||
"value": "false"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "vaapi",
|
||||
"label": "Intel/AMD (streaming rendering and encoding)",
|
||||
"device_requests": [
|
||||
{
|
||||
"id": "selkies-render",
|
||||
"kind": "character-device",
|
||||
"path_prompt": "Intel/AMD render node",
|
||||
"host_path_default": "/dev/dri/renderD128",
|
||||
"container_path_strategy": "same-as-host",
|
||||
"mode": "0660",
|
||||
"deny_write": false,
|
||||
"gid_strategy": "host-device-gid",
|
||||
"drm_vendor_ids": [
|
||||
"0x8086",
|
||||
"0x1002"
|
||||
]
|
||||
}
|
||||
],
|
||||
"environment": [
|
||||
{
|
||||
"name": "PIXELFLUX_WAYLAND",
|
||||
"value": "true"
|
||||
},
|
||||
{
|
||||
"name": "AUTO_GPU",
|
||||
"value": "false"
|
||||
}
|
||||
],
|
||||
"environment_from_devices": {
|
||||
"DRINODE": [
|
||||
"selkies-render"
|
||||
],
|
||||
"DRI_NODE": [
|
||||
"selkies-render"
|
||||
],
|
||||
"ATTACHED_DEVICES_PERMS": [
|
||||
"selkies-render"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"gpu_validation": {
|
||||
"device_inventory": "host-sysfs-and-stat",
|
||||
"application_acceleration": "requires-workload-test",
|
||||
"tone_mapping": "not-implied-by-device-access"
|
||||
},
|
||||
"device_permissions": {
|
||||
"strategy": "linuxserver-native-init",
|
||||
"service_user": "abc",
|
||||
"environment": "ATTACHED_DEVICES_PERMS",
|
||||
"paths": "all-resolved-selected-character-devices"
|
||||
}
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"shm_size",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,476 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-audiobookshelf",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Audiobookshelf"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Audiobookshelf is a self-hosted audiobook and podcast server."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Audiobookshelf is a self-hosted media server designed for managing and streaming audiobooks, podcasts, and e-books, offering a secure and flexible solution for personal media libraries. Its lightweight architecture and intuitive Web interface (available as a Progressive Web App, PWA) enable seamless access from any browser, while beta Android and iOS apps support offline listening, catering to privacy-focused media enthusiasts.\n\nThe app supports on-the-fly streaming of all audio formats and provides robust management tools, including automatic metadata and cover art fetching from multiple sources, bulk drag-and-drop uploads for books and podcasts, and chapter editing with lookup via the Audnexus API. Users can search and subscribe to podcasts with auto-downloading episodes or manage content via open RSS feeds. It supports multi-user access with custom permissions, ensuring individual playback progress syncs across devices. Additionally, it offers audio tools (like merging files into m4b or embedding metadata) and experimental e-book support (epub, pdf, cbr, cbz), with the ability to send e-books to devices like Kindle.\n\nIt automatically detects library updates, eliminating manual rescans, and includes daily automated backups to safeguard metadata. Chromecast support (on Web and Android apps) enhances streaming capabilities, while an active community provides support documentation for continuous improvements. Whether for personal collections or family sharing, the app's intuitive interface and versatile features deliver a modern media management platform, meeting diverse needs.\n\n**Key Features:**\n- Multi-user support w/ custom permissions\n- Keeps progress per user and syncs across devices\n- Lookup and apply metadata and cover art from several providers\n- Audiobook chapter editor w/ chapter lookup\n- Audiobook tools: Embed metadata in audio files & merge multiple audio files to a single m4b\n- Search and add podcasts to download episodes w/ auto-download\n- Open RSS feeds for audiobooks and podcast episodes\n- Backups with automated backup scheduling\n- Basic ebook support and ereader (epub, pdf, cbr, cbz) + send to device (i.e. Kindle)\n\n**Learn More:**\n- [Audiobookshelf Official Website](https://audiobookshelf.org)\n- [Audiobookshelf GitHub Repository](https://github.com/advplyr/audiobookshelf)\n"
|
||||
},
|
||||
"category": "media",
|
||||
"category_label": "Media & Streaming",
|
||||
"author": "advplyr",
|
||||
"developer": "advplyr",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 80,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://audiobookshelf.org",
|
||||
"documentation": null,
|
||||
"repository": "https://ghcr.io/advplyr/audiobookshelf",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "advplyr",
|
||||
"repository": "https://ghcr.io/advplyr/audiobookshelf",
|
||||
"revision": "9d718efdc366f5df43bbc93cf4de5854828553bb3321addaf7b2d084202ef220",
|
||||
"image_repository_url": "https://ghcr.io/advplyr/audiobookshelf",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "9d718efdc366f5df43bbc93cf4de5854828553bb3321addaf7b2d084202ef220",
|
||||
"generated_at": "2026-09-13T15:34:57+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "audiobookshelf",
|
||||
"container_name": "audiobookshelf",
|
||||
"image": {
|
||||
"reference": "ghcr.io/advplyr/audiobookshelf:latest",
|
||||
"registry": "ghcr.io",
|
||||
"repository": "ghcr.io/advplyr/audiobookshelf",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/audiobooks",
|
||||
"compose_source_example": "/DATA/Media/Audiobooks",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-1",
|
||||
"container_path": "/podcasts",
|
||||
"compose_source_example": "/DATA/Media/Podcasts",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-2",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/DATA/AppData/$AppID/config",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 4
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-3",
|
||||
"container_path": "/metadata",
|
||||
"compose_source_example": "/DATA/AppData/$AppID/metadata",
|
||||
"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": 13378,
|
||||
"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: audiobookshelf\nservices:\n audiobookshelf:\n image: ghcr.io/advplyr/audiobookshelf:latest\n container_name: audiobookshelf\n deploy:\n resources:\n reservations:\n memory: 64M\n restart: unless-stopped\n volumes:\n - /DATA/Media/Audiobooks:/audiobooks\n - /DATA/Media/Podcasts:/podcasts\n - /DATA/AppData/$AppID/config:/config\n - /DATA/AppData/$AppID/metadata:/metadata\n ports:\n - 13378:80\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "audiobookshelf",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "audiobookshelf",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "audiobookshelf",
|
||||
"image": "ghcr.io/advplyr/audiobookshelf:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"image": "ghcr.io/advplyr/audiobookshelf:latest",
|
||||
"container_name": "audiobookshelf",
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "64M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"restart": "unless-stopped",
|
||||
"volumes": [
|
||||
"/DATA/Media/Audiobooks:/audiobooks",
|
||||
"/DATA/Media/Podcasts:/podcasts",
|
||||
"/DATA/AppData/$AppID/config:/config",
|
||||
"/DATA/AppData/$AppID/metadata:/metadata"
|
||||
],
|
||||
"ports": [
|
||||
"13378:80"
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "audiobookshelf"
|
||||
},
|
||||
"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": "audiobookshelf-volume-0",
|
||||
"service": "audiobookshelf",
|
||||
"container_path": "/audiobooks",
|
||||
"mode": "managed-volume",
|
||||
"user_selectable": false,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"source_path": null,
|
||||
"source_path_prompt": null
|
||||
},
|
||||
{
|
||||
"id": "audiobookshelf-volume-1",
|
||||
"service": "audiobookshelf",
|
||||
"container_path": "/podcasts",
|
||||
"mode": "managed-volume",
|
||||
"user_selectable": false,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"source_path": null,
|
||||
"source_path_prompt": null
|
||||
},
|
||||
{
|
||||
"id": "audiobookshelf-volume-2",
|
||||
"service": "audiobookshelf",
|
||||
"container_path": "/config",
|
||||
"mode": "managed-volume",
|
||||
"user_selectable": false,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"source_path": null,
|
||||
"source_path_prompt": null
|
||||
},
|
||||
{
|
||||
"id": "audiobookshelf-volume-3",
|
||||
"service": "audiobookshelf",
|
||||
"container_path": "/metadata",
|
||||
"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": [
|
||||
"audiobookshelf"
|
||||
],
|
||||
"stop_order": [
|
||||
"audiobookshelf"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 80,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"credentials": []
|
||||
},
|
||||
"proxmox": {
|
||||
"runtime": "native-oci-lxc",
|
||||
"technology_status": "proxmox-technology-preview",
|
||||
"defaults": {
|
||||
"unprivileged": true,
|
||||
"ostype": "auto-from-image",
|
||||
"cores": 2,
|
||||
"memory_mb": 128,
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"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,405 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-autobrr",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Autobrr"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Modern, easy to use download automation for torrents and usenet."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Autobrr is the modern download automation tool for torrents and usenet. With inspiration and ideas from tools like trackarr, autodl-irssi and flexget we built one tool that can do it all, and then some."
|
||||
},
|
||||
"category": "arr",
|
||||
"category_label": "*Arr Suite",
|
||||
"author": "Autobrr Team",
|
||||
"developer": "Autobrr Team",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 7474,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://autobrr.com",
|
||||
"documentation": null,
|
||||
"repository": "https://ghcr.io/autobrr/autobrr",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "official",
|
||||
"repository": "https://ghcr.io/autobrr/autobrr",
|
||||
"revision": "d33fd5e67068324754ca3a0f1345efc2893dabe5fb06c65ada9910b9254fb4b7",
|
||||
"image_repository_url": "https://ghcr.io/autobrr/autobrr",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "d33fd5e67068324754ca3a0f1345efc2893dabe5fb06c65ada9910b9254fb4b7",
|
||||
"generated_at": "2026-09-13T15:34:57+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "autobrr",
|
||||
"container_name": "autobrr",
|
||||
"image": {
|
||||
"reference": "ghcr.io/autobrr/autobrr:latest",
|
||||
"registry": "ghcr.io",
|
||||
"repository": "ghcr.io/autobrr/autobrr",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "$TZ",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/DATA/AppData/$AppID/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": 7474,
|
||||
"published_example": 7474,
|
||||
"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: autobrr\nservices:\n autobrr:\n container_name: autobrr\n image: ghcr.io/autobrr/autobrr:latest\n network_mode: bridge\n restart: unless-stopped\n environment:\n TZ: $TZ\n ports:\n - target: 7474\n published: '7474'\n protocol: tcp\n volumes:\n - type: bind\n source: /DATA/AppData/$AppID/config\n target: /config\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "autobrr",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "autobrr",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "autobrr",
|
||||
"image": "ghcr.io/autobrr/autobrr:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"container_name": "autobrr",
|
||||
"image": "ghcr.io/autobrr/autobrr:latest",
|
||||
"network_mode": "bridge",
|
||||
"restart": "unless-stopped",
|
||||
"environment": {
|
||||
"TZ": "$TZ"
|
||||
},
|
||||
"ports": [
|
||||
{
|
||||
"target": 7474,
|
||||
"published": "7474",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/config",
|
||||
"target": "/config"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "autobrr"
|
||||
},
|
||||
"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": "autobrr-volume-0",
|
||||
"service": "autobrr",
|
||||
"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": [
|
||||
"autobrr"
|
||||
],
|
||||
"stop_order": [
|
||||
"autobrr"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 7474,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"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,264 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-azahar",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Azahar"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Azahar is an open-source 3DS emulator based on Citra."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Azahar is an open-source 3DS emulator based on Citra."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/azahar-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/azahar-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://azahar-emu.org/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-azahar/",
|
||||
"repository": "https://github.com/linuxserver/docker-azahar",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-03-05",
|
||||
"note": "Make Wayland default disable with PIXELFLUX_WAYLAND=false."
|
||||
},
|
||||
{
|
||||
"date": "2025-12-20",
|
||||
"note": "Add Wayland init logic."
|
||||
},
|
||||
{
|
||||
"date": "2025-11-29",
|
||||
"note": "Initial Version."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-03-05"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-azahar",
|
||||
"default_branch": "master",
|
||||
"revision": "1f07417fbd6757438809cbaaf834961708799842",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-azahar/1f07417fbd6757438809cbaaf834961708799842/README.md",
|
||||
"readme_pushed_at": "2026-09-12T04:47:01Z",
|
||||
"compose_sha256": "c1db41560f28bb74cf13239c12b31d5983ad42f669b64579887c8b43ded40bdb",
|
||||
"generated_at": "2026-09-12T14:37:23+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "azahar",
|
||||
"container_name": "azahar",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/azahar:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/azahar",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/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": 3000,
|
||||
"published_example": 3000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 3001,
|
||||
"published_example": 3001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n azahar:\n image: lscr.io/linuxserver/azahar:latest\n container_name: azahar\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/config:/config\n ports:\n - 3000:3000\n - 3001:3001\n shm_size: \"1gb\"\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
}
|
||||
],
|
||||
"installer_profile": {
|
||||
"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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"shm_size",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,248 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-babybuddy",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Babybuddy"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Babybuddy is a buddy for babies! Helps caregivers track sleep, feedings, diaper changes, tummy time and more to learn about and predict baby's needs without (as much) guess work."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Babybuddy is a buddy for babies! Helps caregivers track sleep, feedings, diaper changes, tummy time and more to learn about and predict baby's needs without (as much) guess work."
|
||||
},
|
||||
"category": "productivity",
|
||||
"category_label": "Productivity & Workflows",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/babybuddy-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/babybuddy-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 8000,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://github.com/babybuddy/babybuddy",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-babybuddy/",
|
||||
"repository": "https://github.com/linuxserver/docker-babybuddy",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-07-21",
|
||||
"note": "Rebase to Alpine 3.24."
|
||||
},
|
||||
{
|
||||
"date": "2025-07-27",
|
||||
"note": "Rebase to Alpine 3.22."
|
||||
},
|
||||
{
|
||||
"date": "2024-06-30",
|
||||
"note": "Rebase to Alpine 3.20. Existing users should update their nginx confs to avoid http2 deprecation warnings."
|
||||
},
|
||||
{
|
||||
"date": "2023-12-23",
|
||||
"note": "Rebase to Alpine 3.19 with php 8.3."
|
||||
},
|
||||
{
|
||||
"date": "2023-07-05",
|
||||
"note": "Add standard HTTP/HTTPS listen ports 80 and 443, keeping 8000 for backwards compatibility."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-07-21"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-babybuddy",
|
||||
"default_branch": "main",
|
||||
"revision": "8743066585b4d5e07385ff33371ec56f6ca5988a",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-babybuddy/8743066585b4d5e07385ff33371ec56f6ca5988a/README.md",
|
||||
"readme_pushed_at": "2026-09-12T14:25:14Z",
|
||||
"compose_sha256": "2918bb204dae64bf4f514de2bfa19f51424c94f19445478aca3a13c60fcb64ef",
|
||||
"generated_at": "2026-09-12T14:37:23+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "babybuddy",
|
||||
"container_name": "babybuddy",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/babybuddy:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/babybuddy",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "CSRF_TRUSTED_ORIGINS",
|
||||
"example": "http://127.0.0.1:8000,https://babybuddy.domain.com",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/babybuddy/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": 8000,
|
||||
"published_example": 8000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n babybuddy:\n image: lscr.io/linuxserver/babybuddy:latest\n container_name: babybuddy\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n - CSRF_TRUSTED_ORIGINS=http://127.0.0.1:8000,https://babybuddy.domain.com\n volumes:\n - /path/to/babybuddy/config:/config\n ports:\n - 8000:8000\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 8000,
|
||||
"path": "/",
|
||||
"source": "compose-first-tcp-port-fallback"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,279 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-bambustudio",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Bambustudio"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Bambu Studio is an open-source, cutting-edge, feature-rich slicing software. It contains project-based workflows, systematically optimized slicing algorithms, and an easy-to-use graphical interface, bringing users an incredibly smooth printing experience."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Bambu Studio is an open-source, cutting-edge, feature-rich slicing software. It contains project-based workflows, systematically optimized slicing algorithms, and an easy-to-use graphical interface, bringing users an incredibly smooth printing experience."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/bambustudio-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/bambustudio-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://bambulab.com/en/download/studio",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-bambustudio/",
|
||||
"repository": "https://github.com/linuxserver/docker-bambustudio",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-04-29",
|
||||
"note": "Rebase to resolute."
|
||||
},
|
||||
{
|
||||
"date": "2026-04-11",
|
||||
"note": "Ingest from pre-release, make Wayland default disable with PIXELFLUX_WAYLAND=false."
|
||||
},
|
||||
{
|
||||
"date": "2025-12-28",
|
||||
"note": "Add Wayland init logic."
|
||||
},
|
||||
{
|
||||
"date": "2025-08-31",
|
||||
"note": "Update AppImage ingestion."
|
||||
},
|
||||
{
|
||||
"date": "2025-08-14",
|
||||
"note": "Rebase to Ubuntu Noble to ingest approved appimage."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-04-29"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-bambustudio",
|
||||
"default_branch": "master",
|
||||
"revision": "3d3bba442d60a77c4165b7023530aa9a94618d83",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-bambustudio/3d3bba442d60a77c4165b7023530aa9a94618d83/README.md",
|
||||
"readme_pushed_at": "2026-09-12T09:25:40Z",
|
||||
"compose_sha256": "0e5ff6cd158cab73096ed4c4ddebb4795a78ba2ed9d776c568b5caad4a008659",
|
||||
"generated_at": "2026-09-12T14:37:24+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "bambustudio",
|
||||
"container_name": "bambustudio",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/bambustudio:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/bambustudio",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "DARK_MODE",
|
||||
"example": "true",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/bambustudio/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": 3000,
|
||||
"published_example": 3000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 3001,
|
||||
"published_example": 3001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n bambustudio:\n image: lscr.io/linuxserver/bambustudio:latest\n container_name: bambustudio\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n - DARK_MODE=true #optional\n volumes:\n - /path/to/bambustudio/config:/config\n ports:\n - 3000:3000\n - 3001:3001\n shm_size: \"1gb\"\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
}
|
||||
],
|
||||
"installer_profile": {
|
||||
"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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"shm_size",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,275 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-bazarr",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Bazarr"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Bazarr is a companion application to Sonarr and Radarr. It can manage and download subtitles based on your requirements. You define your preferences by TV show or movie and Bazarr takes care of everything for you."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Bazarr is a companion application to Sonarr and Radarr. It can manage and download subtitles based on your requirements. You define your preferences by TV show or movie and Bazarr takes care of everything for you."
|
||||
},
|
||||
"category": "arr",
|
||||
"category_label": "*Arr Suite",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/bazarr-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/bazarr-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 6767,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://www.bazarr.media/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-bazarr/",
|
||||
"repository": "https://github.com/linuxserver/docker-bazarr",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2025-12-28",
|
||||
"note": "Rebase to Alpine 3.23."
|
||||
},
|
||||
{
|
||||
"date": "2025-07-05",
|
||||
"note": "Rebase to Alpine 3.22."
|
||||
},
|
||||
{
|
||||
"date": "2024-12-24",
|
||||
"note": "Rebase to Alpine 3.21."
|
||||
},
|
||||
{
|
||||
"date": "2024-06-24",
|
||||
"note": "Rebase to Alpine 3.20."
|
||||
},
|
||||
{
|
||||
"date": "2023-12-23",
|
||||
"note": "Rebase to Alpine 3.19."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2025-12-28"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-bazarr",
|
||||
"default_branch": "master",
|
||||
"revision": "2154b521ffbee2deaece8abb9684fb3c275825a9",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-bazarr/2154b521ffbee2deaece8abb9684fb3c275825a9/README.md",
|
||||
"readme_pushed_at": "2026-09-09T14:47:26Z",
|
||||
"compose_sha256": "3734d559f54c05209e16a08310439640bd13c410b4efc8ea903e72f5760bf6ae",
|
||||
"generated_at": "2026-09-12T14:37:24+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "bazarr",
|
||||
"container_name": "bazarr",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/bazarr:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/bazarr",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/bazarr/config",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 4
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-1",
|
||||
"container_path": "/movies",
|
||||
"compose_source_example": "/path/to/movies",
|
||||
"read_only": false,
|
||||
"required": false,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind",
|
||||
"skip"
|
||||
],
|
||||
"default": "skip",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-2",
|
||||
"container_path": "/tv",
|
||||
"compose_source_example": "/path/to/tv",
|
||||
"read_only": false,
|
||||
"required": false,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind",
|
||||
"skip"
|
||||
],
|
||||
"default": "skip",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
}
|
||||
],
|
||||
"ports": [
|
||||
{
|
||||
"container_port": 6767,
|
||||
"published_example": 6767,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n bazarr:\n image: lscr.io/linuxserver/bazarr:latest\n container_name: bazarr\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/bazarr/config:/config\n - /path/to/movies:/movies #optional\n - /path/to/tv:/tv #optional\n ports:\n - 6767:6767\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 6767,
|
||||
"path": "/",
|
||||
"source": "compose-first-tcp-port-fallback"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,444 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-beaverhabittracker",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "BeaverHabitTracker"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "A self-hosted, goal-free habit tracking tool."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Beaver Habit Tracker is a self-hosted habit tracking tool designed for users who want to effortlessly monitor daily behaviors without the stress of goal-setting. Its intuitive Web interface offers a pressure-free tracking experience, ideal for those focused on behavior observation and personal growth.\n\nThe tool's core features include goal-free habit tracking and a minimalist interface. It allows users to log multiple habits easily, without focusing on streaks or targets, and provides simple visualizations to understand behavior patterns. Users can add daily notes to record specific activities or reflections, with a smooth, low-effort interface.\n\nIt uses a self-hosted approach, ensuring data privacy and full control, with a lightweight, efficient design requiring minimal server resources. Users can manually reorder habits for an optimized experience. The tool's stress-free observation and intuitive operation help users gradually improve habits, delivering a modern habit management solution.\n\n**Key Features:**\n- Goal-free habit tracking focused on awareness, not achievement\n- Clean, minimalist interface for effortless daily logging\n- Lightweight and efficient, requiring minimal server resources\n- Simple visualizations to understand behavior patterns\n- Daily notes for recording activities or reflections\n\n**Learn More:**\n- [Beaver Habit Tracker Official Website](https://beaverhabits.com/)\n- [Beaver Habit Tracker GitHub](https://github.com/daya0576/beaverhabits)\n"
|
||||
},
|
||||
"category": "productivity",
|
||||
"category_label": "Productivity & Workflows",
|
||||
"author": "daya0576",
|
||||
"developer": "daya0576",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 8080,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://beaverhabits.com/",
|
||||
"documentation": null,
|
||||
"repository": "https://hub.docker.com/r/daya0576/beaverhabits",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "daya0576",
|
||||
"repository": "https://hub.docker.com/r/daya0576/beaverhabits",
|
||||
"revision": "5f7669fb9cdd5e2af81fea312b3747b782866673efa53c37096b54b64e6edb79",
|
||||
"image_repository_url": "https://hub.docker.com/r/daya0576/beaverhabits",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "5f7669fb9cdd5e2af81fea312b3747b782866673efa53c37096b54b64e6edb79",
|
||||
"generated_at": "2026-09-13T15:34:57+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "beaverhabittracker",
|
||||
"container_name": "beaverhabittracker",
|
||||
"image": {
|
||||
"reference": "daya0576/beaverhabits:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "daya0576/beaverhabits",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "HABITS_STORAGE",
|
||||
"example": "USER_DISK",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "TRUSTED_LOCAL_EMAIL",
|
||||
"example": "your@email.com",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "INDEX_HABIT_DATE_COLUMNS",
|
||||
"example": "5",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "ENABLE_IOS_STANDALONE",
|
||||
"example": "True",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/app/.user",
|
||||
"compose_source_example": "/DATA/AppData/$AppID/",
|
||||
"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": 8080,
|
||||
"published_example": 15580,
|
||||
"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: beaverhabittracker\nservices:\n beaverhabittracker:\n image: daya0576/beaverhabits:latest\n container_name: beaverhabittracker\n deploy:\n resources:\n limits:\n memory: 128M\n reservations:\n memory: 128M\n restart: unless-stopped\n user: 1000:1000\n ports:\n - target: 8080\n published: '15580'\n protocol: tcp\n volumes:\n - type: bind\n source: /DATA/AppData/$AppID/\n target: /app/.user\n environment:\n HABITS_STORAGE: USER_DISK\n TRUSTED_LOCAL_EMAIL: your@email.com\n INDEX_HABIT_DATE_COLUMNS: 5\n ENABLE_IOS_STANDALONE: true\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "beaverhabittracker",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "beaverhabittracker",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "beaverhabittracker",
|
||||
"image": "daya0576/beaverhabits:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"image": "daya0576/beaverhabits:latest",
|
||||
"container_name": "beaverhabittracker",
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"limits": {
|
||||
"memory": "128M"
|
||||
},
|
||||
"reservations": {
|
||||
"memory": "128M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"restart": "unless-stopped",
|
||||
"user": "1000:1000",
|
||||
"ports": [
|
||||
{
|
||||
"target": 8080,
|
||||
"published": "15580",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/",
|
||||
"target": "/app/.user"
|
||||
}
|
||||
],
|
||||
"environment": {
|
||||
"HABITS_STORAGE": "USER_DISK",
|
||||
"TRUSTED_LOCAL_EMAIL": "your@email.com",
|
||||
"INDEX_HABIT_DATE_COLUMNS": 5,
|
||||
"ENABLE_IOS_STANDALONE": true
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "beaverhabittracker"
|
||||
},
|
||||
"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": "beaverhabittracker-volume-0",
|
||||
"service": "beaverhabittracker",
|
||||
"container_path": "/app/.user",
|
||||
"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": [
|
||||
"beaverhabittracker"
|
||||
],
|
||||
"stop_order": [
|
||||
"beaverhabittracker"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 8080,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"credentials": []
|
||||
},
|
||||
"proxmox": {
|
||||
"runtime": "native-oci-lxc",
|
||||
"technology_status": "proxmox-technology-preview",
|
||||
"defaults": {
|
||||
"unprivileged": true,
|
||||
"ostype": "auto-from-image",
|
||||
"cores": 2,
|
||||
"memory_mb": 128,
|
||||
"swap_mb": 512,
|
||||
"rootfs_size_gb": 8,
|
||||
"rootfs_storage": "local-lvm",
|
||||
"volume_storage": "local-lvm",
|
||||
"template_storage": "local",
|
||||
"bridge": "vmbr0",
|
||||
"ipv4": "dhcp",
|
||||
"firewall": true,
|
||||
"host_managed_network": true,
|
||||
"onboot": false,
|
||||
"features": [
|
||||
"nesting=1"
|
||||
],
|
||||
"shutdown_timeout_seconds": 30
|
||||
},
|
||||
"image_metadata_policy": {
|
||||
"entrypoint": "import-from-oci-image",
|
||||
"cmd": "import-from-oci-image",
|
||||
"environment": "import-image-env-then-apply-compose-overrides",
|
||||
"user": "import-from-oci-image",
|
||||
"working_dir": "import-from-oci-image",
|
||||
"stop_signal": "import-from-oci-image"
|
||||
},
|
||||
"installer_profile": {
|
||||
"runtime": {
|
||||
"user": "1000:1000"
|
||||
}
|
||||
},
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"behavioral_impact": "A privileged LXC has weaker isolation from the Proxmox host.",
|
||||
"validation": "native-equivalent"
|
||||
},
|
||||
{
|
||||
"id": "compose-process-runtime",
|
||||
"upstream_behavior": "Compose can replace Entrypoint, User and WorkingDir and request an init process or interactive terminal.",
|
||||
"native_lxc_behavior": "ProxMenux applies the process overrides through native LXC init directives; lxc-init provides PID 1 supervision and the CT console provides terminal access.",
|
||||
"reason": "The OCI process must start with the same identity, command and working directory without Docker.",
|
||||
"behavioral_impact": "Compose stdin_open and tty become access through the Proxmox LXC console.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-healthcheck",
|
||||
"upstream_behavior": "Docker periodically executes the declared container healthcheck.",
|
||||
"native_lxc_behavior": "For a single-service LXC, ProxMenux translates HTTP localhost checks into a mandatory first-start service check.",
|
||||
"reason": "Proxmox has no persistent Docker health state, while the installer still must detect a failed first boot.",
|
||||
"behavioral_impact": "The check runs during installation rather than continuously after installation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-cpu-priority",
|
||||
"upstream_behavior": "Docker cpu_shares sets a relative scheduling weight with 1024 as its neutral value.",
|
||||
"native_lxc_behavior": "ProxMenux converts the relative weight to Proxmox cpuunits with 100 as its neutral value and lets the user review it.",
|
||||
"reason": "Both settings express relative CPU priority on different scales.",
|
||||
"behavioral_impact": "Rounding and Proxmox minimum limits can slightly change very low weights.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-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": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"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,273 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-beets",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Beets"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Beets is a music library manager and not, for the most part, a music player. It does include a simple player plugin and an experimental Web-based player, but it generally leaves actual sound-reproduction to specialized tools."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Beets is a music library manager and not, for the most part, a music player. It does include a simple player plugin and an experimental Web-based player, but it generally leaves actual sound-reproduction to specialized tools."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/beets-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/beets-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 8337,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "http://beets.io/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-beets/",
|
||||
"repository": "https://github.com/linuxserver/docker-beets",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-02-01",
|
||||
"note": "Rebase to Alpine 3.23."
|
||||
},
|
||||
{
|
||||
"date": "2025-01-27",
|
||||
"note": "Rebase to Alpine 3.21."
|
||||
},
|
||||
{
|
||||
"date": "2024-10-01",
|
||||
"note": "Add packages required for Discogs plugin."
|
||||
},
|
||||
{
|
||||
"date": "2024-08-28",
|
||||
"note": "Rebase to Alpine 3.20, switch from Pillow to Imagemagick."
|
||||
},
|
||||
{
|
||||
"date": "2023-12-23",
|
||||
"note": "Rebase to Alpine 3.19."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-02-01"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-beets",
|
||||
"default_branch": "master",
|
||||
"revision": "c39f8f901aa1caddaaad6265801e853c57fc85f3",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-beets/c39f8f901aa1caddaaad6265801e853c57fc85f3/README.md",
|
||||
"readme_pushed_at": "2026-09-12T11:36:37Z",
|
||||
"compose_sha256": "ba0e36161687eb34fb5a33a9f7a2762c52d84f527e856141cfafcfc1c95f07a4",
|
||||
"generated_at": "2026-09-12T14:37:23+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "beets",
|
||||
"container_name": "beets",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/beets:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/beets",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/beets/config",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 4
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-1",
|
||||
"container_path": "/music",
|
||||
"compose_source_example": "/path/to/music/library",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-2",
|
||||
"container_path": "/downloads",
|
||||
"compose_source_example": "/path/to/ingest",
|
||||
"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": 8337,
|
||||
"published_example": 8337,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n beets:\n image: lscr.io/linuxserver/beets:latest\n container_name: beets\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/beets/config:/config\n - /path/to/music/library:/music\n - /path/to/ingest:/downloads\n ports:\n - 8337:8337\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 8337,
|
||||
"path": "/",
|
||||
"source": "compose-first-tcp-port-fallback"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,418 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-bentopdf",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "BentoPDF"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Privacy-first, self-hosted PDF toolkit"
|
||||
},
|
||||
"description": {
|
||||
"en_US": "**Your PDFs never leave your device.** BentoPDF is a privacy-first PDF toolkit that runs entirely in your browser. Every merge, split, conversion, and edit happens locally on your machine \u2014 no file is ever uploaded to a server. More than 50 tools are bundled into one clean, fast, ad-free interface.\n\n**One app for every PDF job.** Organize and edit your documents (merge, split, reorder, rotate, crop, watermark, page numbers, redaction, annotations and forms), convert to and from PDF (images, Word, Excel, PowerPoint, EPUB, Markdown and more), run OCR, and secure your files with compression, encryption, digital signatures, and metadata cleanup.\n\n**Made for your private cloud.** Self-hosting BentoPDF on a private cloud device like self-hosted server gives your whole household or team a single, ad-free PDF workshop on hardware you control \u2014 fast over the local network, with your documents staying private by design.\n"
|
||||
},
|
||||
"category": "documents",
|
||||
"category_label": "Documents & Notes",
|
||||
"author": "BentoPDF",
|
||||
"developer": "BentoPDF",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 8080,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://bentopdf.com",
|
||||
"documentation": null,
|
||||
"repository": "https://ghcr.io/alam00000/bentopdf-simple",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "alam00000",
|
||||
"repository": "https://ghcr.io/alam00000/bentopdf-simple",
|
||||
"revision": "96324c7dd23e8982ccdab09487f254e7ffaec5b9f9a143530ed8732e053d366d",
|
||||
"image_repository_url": "https://ghcr.io/alam00000/bentopdf-simple",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "96324c7dd23e8982ccdab09487f254e7ffaec5b9f9a143530ed8732e053d366d",
|
||||
"generated_at": "2026-09-13T15:34:57+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "bentopdf",
|
||||
"container_name": "bentopdf",
|
||||
"image": {
|
||||
"reference": "ghcr.io/alam00000/bentopdf-simple:latest",
|
||||
"registry": "ghcr.io",
|
||||
"repository": "ghcr.io/alam00000/bentopdf-simple",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "$PUID",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "$PGID",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "DISABLE_IPV6",
|
||||
"example": "false",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [],
|
||||
"ports": [
|
||||
{
|
||||
"container_port": 8080,
|
||||
"published_example": 3000,
|
||||
"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: bentopdf\nservices:\n bentopdf:\n container_name: bentopdf\n image: ghcr.io/alam00000/bentopdf-simple:latest\n network_mode: bridge\n restart: unless-stopped\n deploy:\n resources:\n reservations:\n memory: 64M\n ports:\n - target: 8080\n published: '3000'\n protocol: tcp\n environment:\n PUID: $PUID\n PGID: $PGID\n DISABLE_IPV6: 'false'\n healthcheck:\n test:\n - CMD\n - wget\n - --spider\n - -q\n - http://localhost:8080\n interval: 30s\n timeout: 10s\n retries: 3\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "bentopdf",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "bentopdf",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "bentopdf",
|
||||
"image": "ghcr.io/alam00000/bentopdf-simple:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"container_name": "bentopdf",
|
||||
"image": "ghcr.io/alam00000/bentopdf-simple:latest",
|
||||
"network_mode": "bridge",
|
||||
"restart": "unless-stopped",
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "64M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"ports": [
|
||||
{
|
||||
"target": 8080,
|
||||
"published": "3000",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"environment": {
|
||||
"PUID": "$PUID",
|
||||
"PGID": "$PGID",
|
||||
"DISABLE_IPV6": "false"
|
||||
},
|
||||
"healthcheck": {
|
||||
"test": [
|
||||
"CMD",
|
||||
"wget",
|
||||
"--spider",
|
||||
"-q",
|
||||
"http://localhost:8080"
|
||||
],
|
||||
"interval": "30s",
|
||||
"timeout": "10s",
|
||||
"retries": 3
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "bentopdf"
|
||||
},
|
||||
"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": [
|
||||
"bentopdf"
|
||||
],
|
||||
"stop_order": [
|
||||
"bentopdf"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 8080,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"credentials": []
|
||||
},
|
||||
"proxmox": {
|
||||
"runtime": "native-oci-lxc",
|
||||
"technology_status": "proxmox-technology-preview",
|
||||
"defaults": {
|
||||
"unprivileged": true,
|
||||
"ostype": "auto-from-image",
|
||||
"cores": 2,
|
||||
"memory_mb": 128,
|
||||
"swap_mb": 512,
|
||||
"rootfs_size_gb": 8,
|
||||
"rootfs_storage": "local-lvm",
|
||||
"volume_storage": "local-lvm",
|
||||
"template_storage": "local",
|
||||
"bridge": "vmbr0",
|
||||
"ipv4": "dhcp",
|
||||
"firewall": true,
|
||||
"host_managed_network": true,
|
||||
"onboot": false,
|
||||
"features": [
|
||||
"nesting=1"
|
||||
],
|
||||
"shutdown_timeout_seconds": 30
|
||||
},
|
||||
"image_metadata_policy": {
|
||||
"entrypoint": "import-from-oci-image",
|
||||
"cmd": "import-from-oci-image",
|
||||
"environment": "import-image-env-then-apply-compose-overrides",
|
||||
"user": "import-from-oci-image",
|
||||
"working_dir": "import-from-oci-image",
|
||||
"stop_signal": "import-from-oci-image"
|
||||
},
|
||||
"installer_profile": {
|
||||
"startup_healthcheck": {
|
||||
"type": "http",
|
||||
"scheme": "http",
|
||||
"port": 8080,
|
||||
"path": "/",
|
||||
"timeout_seconds": 90,
|
||||
"request_timeout_seconds": 10,
|
||||
"stability_seconds": 0,
|
||||
"verify_tls": true,
|
||||
"required": true,
|
||||
"source": "compose-healthcheck"
|
||||
}
|
||||
},
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"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-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": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"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,247 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-bitcoin-knots",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Bitcoin Knots"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Bitcoin Knots can be used as a desktop client for regular payments or as a full node server utility for merchants and other payment services."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Bitcoin Knots can be used as a desktop client for regular payments or as a full node server utility for merchants and other payment services."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/bitcoin-knots-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/bitcoin-knots-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://bitcoinknots.org/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-bitcoin-knots/",
|
||||
"repository": "https://github.com/linuxserver/docker-bitcoin-knots",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-04-03",
|
||||
"note": "Make Wayland default disable with PIXELFLUX_WAYLAND=false."
|
||||
},
|
||||
{
|
||||
"date": "2026-01-02",
|
||||
"note": "Add Wayland init logic."
|
||||
},
|
||||
{
|
||||
"date": "2025-09-09",
|
||||
"note": "Initial release."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-04-03"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-bitcoin-knots",
|
||||
"default_branch": "master",
|
||||
"revision": "99c701f2f45d30332f4373da61890f929d28fc1b",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-bitcoin-knots/99c701f2f45d30332f4373da61890f929d28fc1b/README.md",
|
||||
"readme_pushed_at": "2026-09-07T22:37:03Z",
|
||||
"compose_sha256": "82c572ab0c919634609abe1d9a4c583ed8fea6e0f2800f7deb9863241a03951e",
|
||||
"generated_at": "2026-09-12T14:37:23+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "bitcoin-knots",
|
||||
"container_name": "bitcoin-knots",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/bitcoin-knots:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/bitcoin-knots",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/bitcoin-knots/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": 3000,
|
||||
"published_example": 3000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 3001,
|
||||
"published_example": 3001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 8333,
|
||||
"published_example": 8333,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n bitcoin-knots:\n image: lscr.io/linuxserver/bitcoin-knots:latest\n container_name: bitcoin-knots\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/bitcoin-knots/config:/config\n ports:\n - 3000:3000\n - 3001:3001\n - 8333:8333\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,256 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-blade-of-agony",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Blade Of Agony"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Wolfenstein: Blade of Agony is a story-driven WWII shooter inspired by Wolfenstein and Doom."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Wolfenstein: Blade of Agony is a story-driven WWII shooter inspired by Wolfenstein and Doom."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/blade-of-agony-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/blade-of-agony-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://boa.realm667.com/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-blade-of-agony/",
|
||||
"repository": "https://github.com/linuxserver/docker-blade-of-agony",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-03-26",
|
||||
"note": "Initial release."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-03-26"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-blade-of-agony",
|
||||
"default_branch": "master",
|
||||
"revision": "ecd3048e450ae26d4da48c7cf90d4b4cb7a3bd9e",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-blade-of-agony/ecd3048e450ae26d4da48c7cf90d4b4cb7a3bd9e/README.md",
|
||||
"readme_pushed_at": "2026-09-10T20:27:01Z",
|
||||
"compose_sha256": "23ee58f6f420b01cfb66258159b7441ce268b7b23a4e18dfc65729480c35314e",
|
||||
"generated_at": "2026-09-12T14:37:23+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "blade-of-agony",
|
||||
"container_name": "blade-of-agony",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/blade-of-agony:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/blade-of-agony",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/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": 3000,
|
||||
"published_example": 3000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 3001,
|
||||
"published_example": 3001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n blade-of-agony:\n image: lscr.io/linuxserver/blade-of-agony:latest\n container_name: blade-of-agony\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/config:/config\n ports:\n - 3000:3000\n - 3001:3001\n shm_size: \"1gb\"\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
}
|
||||
],
|
||||
"installer_profile": {
|
||||
"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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"shm_size",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,373 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-blender",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Blender"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Blender is a free and open-source 3D computer graphics software toolset used for creating animated films, visual effects, art, 3D printed models, motion graphics, interactive 3D applications, virtual reality, and computer games. **This image does not support GPU rendering out of the box only accelerated workspace experience**"
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Blender is a free and open-source 3D computer graphics software toolset used for creating animated films, visual effects, art, 3D printed models, motion graphics, interactive 3D applications, virtual reality, and computer games. **This image does not support GPU rendering out of the box only accelerated workspace experience**"
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/blender-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/blender-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://www.blender.org/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-blender/",
|
||||
"repository": "https://github.com/linuxserver/docker-blender",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-04-19",
|
||||
"note": "Rebase to resolute."
|
||||
},
|
||||
{
|
||||
"date": "2026-03-29",
|
||||
"note": "Make Wayland default disable with PIXELFLUX_WAYLAND=false."
|
||||
},
|
||||
{
|
||||
"date": "2025-12-27",
|
||||
"note": "Add wayland init logic."
|
||||
},
|
||||
{
|
||||
"date": "2025-07-12",
|
||||
"note": "Rebase to Selkies, HTTPS IS NOW REQUIRED."
|
||||
},
|
||||
{
|
||||
"date": "2024-08-19",
|
||||
"note": "Rebase to noble."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-04-19"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-blender",
|
||||
"default_branch": "master",
|
||||
"revision": "4b6aa4535da82e95ac2c337ebfc8888ed277c47a",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-blender/4b6aa4535da82e95ac2c337ebfc8888ed277c47a/README.md",
|
||||
"readme_pushed_at": "2026-09-10T18:27:11Z",
|
||||
"compose_sha256": "30f4f98e9d9e1cd1a51dd3f8f6a0f0b3306126dd75ab60124700a47b5dd764dd",
|
||||
"generated_at": "2026-09-12T14:37:23+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "blender",
|
||||
"container_name": "blender",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/blender:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/blender",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "LC_ALL",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "upstream-documentation",
|
||||
"prompt": "Language/locale (e.g. es_ES.UTF-8; translation of every application is not guaranteed)"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/blender/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": 3000,
|
||||
"published_example": 3000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 3001,
|
||||
"published_example": 3001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n blender:\n image: lscr.io/linuxserver/blender:latest\n container_name: blender\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/blender/config:/config\n ports:\n - 3000:3000\n - 3001:3001\n shm_size: \"1gb\"\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
}
|
||||
],
|
||||
"installer_profile": {
|
||||
"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"
|
||||
]
|
||||
},
|
||||
{
|
||||
"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"
|
||||
]
|
||||
}
|
||||
],
|
||||
"selkies": {
|
||||
"base": "FROM ghcr.io/linuxserver/baseimage-selkies:ubunturesolute",
|
||||
"dockerfile_url": "https://raw.githubusercontent.com/linuxserver/docker-blender/master/Dockerfile",
|
||||
"dockerfile_sha256": "c8595b28e544bd2e573052b84a494cff4a2a17c201f10828fe1065b1453a2e68",
|
||||
"reviewed_on": "2026-09-16",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/",
|
||||
"nvidia": "not-offered-until-specific-host-and-image-validation",
|
||||
"validation": "profile-generated; real streaming workload pending"
|
||||
},
|
||||
"optional_devices": [],
|
||||
"hardware_acceleration": {
|
||||
"prompt": "Selkies desktop and streaming acceleration",
|
||||
"default": "none",
|
||||
"profiles": [
|
||||
{
|
||||
"id": "none",
|
||||
"label": "No GPU (CPU)",
|
||||
"device_requests": [],
|
||||
"environment": [
|
||||
{
|
||||
"name": "AUTO_GPU",
|
||||
"value": "false"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "vaapi",
|
||||
"label": "Intel/AMD (streaming rendering and encoding)",
|
||||
"device_requests": [
|
||||
{
|
||||
"id": "selkies-render",
|
||||
"kind": "character-device",
|
||||
"path_prompt": "Intel/AMD render node",
|
||||
"host_path_default": "/dev/dri/renderD128",
|
||||
"container_path_strategy": "same-as-host",
|
||||
"mode": "0660",
|
||||
"deny_write": false,
|
||||
"gid_strategy": "host-device-gid",
|
||||
"drm_vendor_ids": [
|
||||
"0x8086",
|
||||
"0x1002"
|
||||
]
|
||||
}
|
||||
],
|
||||
"environment": [
|
||||
{
|
||||
"name": "PIXELFLUX_WAYLAND",
|
||||
"value": "true"
|
||||
},
|
||||
{
|
||||
"name": "AUTO_GPU",
|
||||
"value": "false"
|
||||
}
|
||||
],
|
||||
"environment_from_devices": {
|
||||
"DRINODE": [
|
||||
"selkies-render"
|
||||
],
|
||||
"DRI_NODE": [
|
||||
"selkies-render"
|
||||
],
|
||||
"ATTACHED_DEVICES_PERMS": [
|
||||
"selkies-render"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"gpu_validation": {
|
||||
"device_inventory": "host-sysfs-and-stat",
|
||||
"application_acceleration": "requires-workload-test",
|
||||
"tone_mapping": "not-implied-by-device-access"
|
||||
},
|
||||
"device_permissions": {
|
||||
"strategy": "linuxserver-native-init",
|
||||
"service_user": "abc",
|
||||
"environment": "ATTACHED_DEVICES_PERMS",
|
||||
"paths": "all-resolved-selected-character-devices"
|
||||
}
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"shm_size",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,581 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-blinko",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Blinko"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Blinko is an AI-powered card note-taking project. Designed for individuals who want to quickly capture and organize their fleeting thoughts. Blinko allows users to seamlessly jot down ideas the moment they strike, ensuring that no spark of creativity is lost."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Blinko is an open-source personal knowledge management and information recording platform, focused on providing users with a lightweight, efficient, and scalable note-taking and knowledge organization experience. Through modular design and a modern technology stack, it enables users to quickly capture ideas, organize knowledge, and build their own information system.\n\nThe project emphasizes simplicity and customizability, supporting flexible combinations of various content types (text, tags, links, etc.), while its clear structured design helps users efficiently retrieve and connect information. Blinko also provides excellent extensibility, making it easy for developers to customize and enhance functionality according to their needs.\n\nIn practical use, Blinko balances usability and functionality, offering a smooth experience for daily note-taking, knowledge accumulation, or project document management - an ideal knowledge tool for long-term personal growth.\n\n**Main features:**\n\n- Lightweight note system for quick content recording and editing\n- Tags and structured organization to improve information retrieval efficiency\n- Support for multiple content types (text, links, etc.)\n- Extensible architecture for custom functionality and plugin development\n- Clean interface design focused on content rather than complex operations\n\n**Learn more:**\n\n- [Blinko GitHub](https://github.com/blinkospace/blinko)\n"
|
||||
},
|
||||
"category": "productivity",
|
||||
"category_label": "Productivity & Workflows",
|
||||
"author": "blinkospace",
|
||||
"developer": "blinkospace",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 1111,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://blinko.space/",
|
||||
"documentation": null,
|
||||
"repository": "https://hub.docker.com/r/blinkospace/blinko",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "official",
|
||||
"repository": "https://hub.docker.com/r/blinkospace/blinko",
|
||||
"revision": "84db2960a2d3880221937ab78a0b98c2a189c23b2b95b853507bea4397cad767",
|
||||
"image_repository_url": "https://hub.docker.com/r/blinkospace/blinko",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "84db2960a2d3880221937ab78a0b98c2a189c23b2b95b853507bea4397cad767",
|
||||
"generated_at": "2026-09-13T15:48:20+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "blinko",
|
||||
"container_name": "blinko",
|
||||
"image": {
|
||||
"reference": "blinkospace/blinko:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "blinkospace/blinko",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "NODE_ENV",
|
||||
"example": "production",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "NEXTAUTH_URL",
|
||||
"example": "http://localhost:1111",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "NEXT_PUBLIC_BASE_URL",
|
||||
"example": "http://localhost:1111",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "NEXTAUTH_SECRET",
|
||||
"example": "${GENERATED_NEXTAUTH_SECRET}",
|
||||
"required": true,
|
||||
"sensitive": true,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "DATABASE_URL",
|
||||
"example": "postgresql://postgres:JWD9bxUR7Um9PaGg7FQZ@blinko-postgres:5432/postgres",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/app/.blinko",
|
||||
"compose_source_example": "/DATA/AppData/$AppID/blinko_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": 1111,
|
||||
"published_example": 1111,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [
|
||||
{
|
||||
"name": "blinko-postgres",
|
||||
"image": "postgres:latest"
|
||||
}
|
||||
],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "name: blinko\nservices:\n blinko:\n image: blinkospace/blinko:latest\n container_name: blinko\n restart: unless-stopped\n networks:\n - blinko-net\n depends_on:\n blinko-postgres:\n condition: service_healthy\n ports:\n - target: 1111\n published: '1111'\n protocol: tcp\n environment:\n NODE_ENV: production\n NEXTAUTH_URL: http://localhost:1111\n NEXT_PUBLIC_BASE_URL: http://localhost:1111\n NEXTAUTH_SECRET: ${GENERATED_NEXTAUTH_SECRET}\n DATABASE_URL: postgresql://postgres:JWD9bxUR7Um9PaGg7FQZ@blinko-postgres:5432/postgres\n volumes:\n - type: bind\n source: /DATA/AppData/$AppID/blinko_data\n target: /app/.blinko\n logging:\n options:\n max-size: 10m\n max-file: '3'\n deploy:\n resources:\n reservations:\n memory: 512m\n blinko-postgres:\n image: postgres:latest\n container_name: blinko-postgres\n restart: unless-stopped\n environment:\n POSTGRES_DB: postgres\n POSTGRES_USER: postgres\n POSTGRES_PASSWORD: ${GENERATED_POSTGRES_PASSWORD}\n TZ: $TZ\n networks:\n - blinko-net\n volumes:\n - type: bind\n source: /DATA/AppData/$AppID/postgres_data\n target: /var/lib/postgresql/data\n deploy:\n resources:\n reservations:\n memory: 256m\n healthcheck:\n test:\n - CMD\n - pg_isready\n - -U\n - postgres\n - -d\n - postgres\n interval: 5s\n timeout: 10s\n retries: 5\nnetworks:\n blinko-net:\n driver: bridge\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "blinko",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "blinko",
|
||||
"service_count": 2,
|
||||
"services": [
|
||||
{
|
||||
"name": "blinko-postgres",
|
||||
"image": "postgres:latest",
|
||||
"is_main": false,
|
||||
"role": "dependency",
|
||||
"vmid_offset": 1,
|
||||
"depends_on": [],
|
||||
"frontend_network": false,
|
||||
"private_network": true,
|
||||
"compose": {
|
||||
"image": "postgres:latest",
|
||||
"container_name": "blinko-postgres",
|
||||
"restart": "unless-stopped",
|
||||
"environment": {
|
||||
"POSTGRES_DB": "postgres",
|
||||
"POSTGRES_USER": "postgres",
|
||||
"POSTGRES_PASSWORD": "${GENERATED_POSTGRES_PASSWORD}",
|
||||
"TZ": "$TZ"
|
||||
},
|
||||
"networks": [
|
||||
"blinko-net"
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/postgres_data",
|
||||
"target": "/var/lib/postgresql/data"
|
||||
}
|
||||
],
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "256m"
|
||||
}
|
||||
}
|
||||
},
|
||||
"healthcheck": {
|
||||
"test": [
|
||||
"CMD",
|
||||
"pg_isready",
|
||||
"-U",
|
||||
"postgres",
|
||||
"-d",
|
||||
"postgres"
|
||||
],
|
||||
"interval": "5s",
|
||||
"timeout": "10s",
|
||||
"retries": 5
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "blinko",
|
||||
"image": "blinkospace/blinko:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [
|
||||
"blinko-postgres"
|
||||
],
|
||||
"frontend_network": true,
|
||||
"private_network": true,
|
||||
"compose": {
|
||||
"image": "blinkospace/blinko:latest",
|
||||
"container_name": "blinko",
|
||||
"restart": "unless-stopped",
|
||||
"networks": [
|
||||
"blinko-net"
|
||||
],
|
||||
"depends_on": {
|
||||
"blinko-postgres": {
|
||||
"condition": "service_healthy"
|
||||
}
|
||||
},
|
||||
"ports": [
|
||||
{
|
||||
"target": 1111,
|
||||
"published": "1111",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"environment": {
|
||||
"NODE_ENV": "production",
|
||||
"NEXTAUTH_URL": "http://localhost:1111",
|
||||
"NEXT_PUBLIC_BASE_URL": "http://localhost:1111",
|
||||
"NEXTAUTH_SECRET": "${GENERATED_NEXTAUTH_SECRET}",
|
||||
"DATABASE_URL": "postgresql://postgres:JWD9bxUR7Um9PaGg7FQZ@blinko-postgres:5432/postgres"
|
||||
},
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/blinko_data",
|
||||
"target": "/app/.blinko"
|
||||
}
|
||||
],
|
||||
"logging": {
|
||||
"options": {
|
||||
"max-size": "10m",
|
||||
"max-file": "3"
|
||||
}
|
||||
},
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "512m"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "blinko",
|
||||
"networks": {
|
||||
"blinko-net": {
|
||||
"driver": "bridge"
|
||||
}
|
||||
}
|
||||
},
|
||||
"networking": {
|
||||
"frontend": "selected-proxmox-bridge",
|
||||
"private_required": true,
|
||||
"private_creation": "automatic-create-if-missing",
|
||||
"private_address_allocation": "automatic-static-address-per-service",
|
||||
"service_discovery": "private-addresses-with-compose-service-host-aliases",
|
||||
"dependency_external_access": "disabled-unless-service-publishes-ports",
|
||||
"prompt_user_for_private_network": false
|
||||
},
|
||||
"storage": [
|
||||
{
|
||||
"id": "blinko-volume-0",
|
||||
"service": "blinko",
|
||||
"container_path": "/app/.blinko",
|
||||
"mode": "managed-volume",
|
||||
"user_selectable": false,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"source_path": null,
|
||||
"source_path_prompt": null
|
||||
},
|
||||
{
|
||||
"id": "blinko-postgres-volume-0",
|
||||
"service": "blinko-postgres",
|
||||
"container_path": "/var/lib/postgresql/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": 2,
|
||||
"start_order": [
|
||||
"blinko-postgres",
|
||||
"blinko"
|
||||
],
|
||||
"stop_order": [
|
||||
"blinko",
|
||||
"blinko-postgres"
|
||||
],
|
||||
"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": "nextauth-secret",
|
||||
"strategy": "generate-cryptographically-random-at-install",
|
||||
"bindings": [
|
||||
{
|
||||
"service": "blinko",
|
||||
"environment_variable": "NEXTAUTH_SECRET"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "postgres-password",
|
||||
"strategy": "generate-cryptographically-random-at-install",
|
||||
"bindings": [
|
||||
{
|
||||
"service": "blinko-postgres",
|
||||
"environment_variable": "POSTGRES_PASSWORD"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 1111,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"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": 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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"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": {
|
||||
"stack_driver": "generic-multi-lxc-stack"
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"cap_add",
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"sysctls",
|
||||
"tty",
|
||||
"user",
|
||||
"volumes",
|
||||
"working_dir"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "Single-image definitions are installable when every declared Compose option has a native Proxmox translation. Multi-image and unsupported runtime features remain blocked until their orchestrator or mapping is available."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "resolve-latest-image-then-apply-reviewed-native-lxc-update",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-compose-sha256-and-resolved-latest-image-digest",
|
||||
"automatic_unattended_updates": false,
|
||||
"dependency_lifecycle": {
|
||||
"implementation": "proxmox-hookscript",
|
||||
"trigger": "main-lxc-pre-start",
|
||||
"waits_for_dependency_healthchecks": true,
|
||||
"stops_dependencies_with_main": false
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,421 @@
|
||||
{
|
||||
"schema_version": "0.4.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-boinc",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Boinc"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "BOINC is a platform for high-throughput computing on a large scale (thousands or millions of computers). It can be used for volunteer computing (using consumer devices) or grid computing (using organizational resources). It supports virtualized, parallel, and GPU-based applications."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "BOINC is a platform for high-throughput computing on a large scale (thousands or millions of computers). It can be used for volunteer computing (using consumer devices) or grid computing (using organizational resources). It supports virtualized, parallel, and GPU-based applications."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/boinc-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/boinc-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 8181,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://boinc.berkeley.edu/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-boinc/",
|
||||
"repository": "https://github.com/linuxserver/docker-boinc",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-04-19",
|
||||
"note": "Rebase to resolute, make Wayland default disable with PIXELFLUX_WAYLAND=false."
|
||||
},
|
||||
{
|
||||
"date": "2025-12-28",
|
||||
"note": "Add Wayland init logic."
|
||||
},
|
||||
{
|
||||
"date": "2025-07-07",
|
||||
"note": "Rebase to selkies. Breaking change: HTTPS is now required. Use port 8181 with HTTPS for direct access. Reverse proxies can connect to 8080 over http as long as it's served over HTTPS to the user."
|
||||
},
|
||||
{
|
||||
"date": "2024-08-19",
|
||||
"note": "Rebase to noble."
|
||||
},
|
||||
{
|
||||
"date": "2024-02-10",
|
||||
"note": "Update Readme with new env vars and ingest proper PWA icon."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-04-19"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-boinc",
|
||||
"default_branch": "master",
|
||||
"revision": "22ffe9988684021b9a1c5a254ef176d1c2dae3f9",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-boinc/22ffe9988684021b9a1c5a254ef176d1c2dae3f9/README.md",
|
||||
"readme_pushed_at": "2026-09-08T15:56:45Z",
|
||||
"compose_sha256": "ff70b5f9e428a6f9cc16db75d2d50a71cd3b99f11c28dc342cbd8c693eb8784e",
|
||||
"generated_at": "2026-09-13T15:35:41+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "boinc",
|
||||
"container_name": "boinc",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/boinc:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/boinc",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PASSWORD",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": true,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "LC_ALL",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "upstream-documentation",
|
||||
"prompt": "Language/locale (e.g. es_ES.UTF-8; translation of every application is not guaranteed)"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/boinc/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": 8080,
|
||||
"published_example": 8080,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 8181,
|
||||
"published_example": 8181,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n boinc:\n image: lscr.io/linuxserver/boinc:latest\n container_name: boinc\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n - PASSWORD= #optional\n volumes:\n - /path/to/boinc/config:/config\n ports:\n - 8080:8080\n - 8181:8181\n devices:\n - /dev/dri:/dev/dri #optional\n shm_size: \"1gb\"\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 8181,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"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"
|
||||
},
|
||||
"installer_profile": {
|
||||
"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"
|
||||
]
|
||||
},
|
||||
{
|
||||
"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"
|
||||
]
|
||||
}
|
||||
],
|
||||
"device_requests": [
|
||||
{
|
||||
"id": "vaapi-render",
|
||||
"kind": "character-device",
|
||||
"purpose": "vaapi",
|
||||
"enable_prompt": "VA-API video acceleration",
|
||||
"enabled_default": false,
|
||||
"required_by_compose": false,
|
||||
"path_prompt": "GPU render device",
|
||||
"host_path_default": "/dev/dri/renderD128",
|
||||
"container_path_strategy": "same-as-host",
|
||||
"mode": "0660",
|
||||
"deny_write": false,
|
||||
"gid_strategy": "host-device-gid",
|
||||
"source_mapping": "/dev/dri:/dev/dri"
|
||||
}
|
||||
],
|
||||
"gpu_validation": {
|
||||
"device_inventory": "host-sysfs-and-stat",
|
||||
"application_acceleration": "requires-workload-test",
|
||||
"tone_mapping": "not-implied-by-device-access"
|
||||
},
|
||||
"device_permissions": {
|
||||
"strategy": "linuxserver-native-init",
|
||||
"service_user": "abc",
|
||||
"environment": "ATTACHED_DEVICES_PERMS",
|
||||
"paths": "all-resolved-selected-character-devices"
|
||||
},
|
||||
"selkies": {
|
||||
"base": "FROM ghcr.io/linuxserver/baseimage-selkies:ubunturesolute",
|
||||
"dockerfile_url": "https://raw.githubusercontent.com/linuxserver/docker-boinc/master/Dockerfile",
|
||||
"dockerfile_sha256": "dde889004f5e40e783d2aacc615dda55ae7fe0eac713423595bcb2fbd4b5c5bd",
|
||||
"reviewed_on": "2026-09-16",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/",
|
||||
"nvidia": "not-offered-until-specific-host-and-image-validation",
|
||||
"validation": "profile-generated; real streaming workload pending"
|
||||
}
|
||||
},
|
||||
"adaptations": [
|
||||
{
|
||||
"id": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-command",
|
||||
"upstream_behavior": "Compose replaces the image Cmd while retaining its Entrypoint.",
|
||||
"native_lxc_behavior": "ProxMenux reads the official OCI Entrypoint and combines it with the Compose command as the native LXC init command.",
|
||||
"reason": "Proxmox stores the effective OCI process as one entrypoint string.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-process-runtime",
|
||||
"upstream_behavior": "Compose can replace Entrypoint, User and WorkingDir and request an init process or interactive terminal.",
|
||||
"native_lxc_behavior": "ProxMenux applies the process overrides through native LXC init directives; lxc-init provides PID 1 supervision and the CT console provides terminal access.",
|
||||
"reason": "The OCI process must start with the same identity, command and working directory without Docker.",
|
||||
"behavioral_impact": "Compose stdin_open and tty become access through the Proxmox LXC console.",
|
||||
"validation": "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-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": "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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"user",
|
||||
"volumes",
|
||||
"working_dir"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,297 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-bookstack",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Bookstack"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Bookstack is a free and open source Wiki designed for creating beautiful documentation. Featuring a simple, but powerful WYSIWYG editor it allows for teams to create detailed and useful documentation with ease."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Bookstack is a free and open source Wiki designed for creating beautiful documentation. Featuring a simple, but powerful WYSIWYG editor it allows for teams to create detailed and useful documentation with ease."
|
||||
},
|
||||
"category": "documents",
|
||||
"category_label": "Documents & Notes",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/bookstack-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/bookstack-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 80,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://codeberg.org/bookstack/bookstack",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-bookstack/",
|
||||
"repository": "https://github.com/linuxserver/docker-bookstack",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-08-05",
|
||||
"note": "Run the async queue worker as the PUID/PGID-managed abc user."
|
||||
},
|
||||
{
|
||||
"date": "2026-07-05",
|
||||
"note": "Rebase to Alpine 3.24."
|
||||
},
|
||||
{
|
||||
"date": "2026-04-29",
|
||||
"note": "Switch to pulling releases from [Codeberg](https://codeberg.org/bookstack/bookstack)."
|
||||
},
|
||||
{
|
||||
"date": "2025-12-28",
|
||||
"note": "Rebase to Alpine 3.23."
|
||||
},
|
||||
{
|
||||
"date": "2025-07-05",
|
||||
"note": "Rebase to Alpine 3.22."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-08-05"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-bookstack",
|
||||
"default_branch": "master",
|
||||
"revision": "b36da9cac7b506f71fa1acc55528d6923db5b471",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-bookstack/b36da9cac7b506f71fa1acc55528d6923db5b471/README.md",
|
||||
"readme_pushed_at": "2026-09-07T21:32:19Z",
|
||||
"compose_sha256": "b0be2e3cba70b0ef414aeb81040f3bfbf970eaac0a8458103ab93c1859162498",
|
||||
"generated_at": "2026-09-12T14:37:23+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "bookstack",
|
||||
"container_name": "bookstack",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/bookstack:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/bookstack",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "APP_URL",
|
||||
"example": "",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "APP_KEY",
|
||||
"example": "",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "DB_HOST",
|
||||
"example": "",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "DB_PORT",
|
||||
"example": "3306",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "DB_USERNAME",
|
||||
"example": "",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "DB_PASSWORD",
|
||||
"example": "",
|
||||
"required": true,
|
||||
"sensitive": true,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "DB_DATABASE",
|
||||
"example": "",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "QUEUE_CONNECTION",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/bookstack/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": 80,
|
||||
"published_example": 6875,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n bookstack:\n image: lscr.io/linuxserver/bookstack:latest\n container_name: bookstack\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n - APP_URL=\n - APP_KEY=\n - DB_HOST=\n - DB_PORT=3306\n - DB_USERNAME=\n - DB_PASSWORD=\n - DB_DATABASE=\n - QUEUE_CONNECTION= #optional\n volumes:\n - /path/to/bookstack/config:/config\n ports:\n - 6875:80\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 80,
|
||||
"path": "/",
|
||||
"source": "compose-first-tcp-port-fallback"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,273 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-brave",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Brave"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "The Brave browser is a fast, private and secure web browser for PC, Mac and mobile."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "The Brave browser is a fast, private and secure web browser for PC, Mac and mobile."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/brave-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/brave-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://brave.com/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-brave/",
|
||||
"repository": "https://github.com/linuxserver/docker-brave",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-04-20",
|
||||
"note": "Added Brave Origin as origin tag."
|
||||
},
|
||||
{
|
||||
"date": "2026-03-31",
|
||||
"note": "Make Wayland default disable with PIXELFLUX_WAYLAND=false."
|
||||
},
|
||||
{
|
||||
"date": "2025-12-20",
|
||||
"note": "Add Wayland init logic."
|
||||
},
|
||||
{
|
||||
"date": "2025-09-22",
|
||||
"note": "Rebase to Debian Trixie."
|
||||
},
|
||||
{
|
||||
"date": "2025-06-06",
|
||||
"note": "Initial Version."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-04-20"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-brave",
|
||||
"default_branch": "master",
|
||||
"revision": "f7b34939eb09b1a1414a70067e2eb57599e84f84",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-brave/f7b34939eb09b1a1414a70067e2eb57599e84f84/README.md",
|
||||
"readme_pushed_at": "2026-09-11T17:22:56Z",
|
||||
"compose_sha256": "0ac179828ccab3a0dfc105088fd5ab86652bfb5e25c406afe6d5083725da5f69",
|
||||
"generated_at": "2026-09-12T14:37:24+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "brave",
|
||||
"container_name": "brave",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/brave:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/brave",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/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": 3000,
|
||||
"published_example": 3000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 3001,
|
||||
"published_example": 3001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n brave:\n image: lscr.io/linuxserver/brave:latest\n container_name: brave\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/config:/config\n ports:\n - 3000:3000\n - 3001:3001\n shm_size: \"1gb\"\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
}
|
||||
],
|
||||
"installer_profile": {
|
||||
"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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"shm_size",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,248 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-budge",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Budge"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "budge is an open source 'budgeting with envelopes' personal finance app."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "budge is an open source 'budgeting with envelopes' personal finance app."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/budge-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/budge-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 80,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://github.com/linuxserver/budge",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-budge/",
|
||||
"repository": "https://github.com/linuxserver/docker-budge",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2024-06-06",
|
||||
"note": "Rebase to Alpine 3.20. Existing users should update their nginx confs to avoid http2 deprecation warnings."
|
||||
},
|
||||
{
|
||||
"date": "2024-03-06",
|
||||
"note": "Existing users should update: site-confs/default.conf - Cleanup default site conf."
|
||||
},
|
||||
{
|
||||
"date": "2024-03-06",
|
||||
"note": "Rebase to Alpine 3.19 with php 8.3."
|
||||
},
|
||||
{
|
||||
"date": "2023-05-25",
|
||||
"note": "Rebase to Alpine 3.18, deprecate armhf."
|
||||
},
|
||||
{
|
||||
"date": "2023-04-13",
|
||||
"note": "Move ssl.conf include to default.conf."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2024-06-06"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-budge",
|
||||
"default_branch": "main",
|
||||
"revision": "6dc66fab7df7b12c131a0f13781051f6c3980b94",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-budge/6dc66fab7df7b12c131a0f13781051f6c3980b94/README.md",
|
||||
"readme_pushed_at": "2026-06-28T06:11:17Z",
|
||||
"compose_sha256": "1f0b8db2a184d63d095b475291c723a1a701b649589b726745c3780916dcffdd",
|
||||
"generated_at": "2026-09-12T14:37:24+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "budge",
|
||||
"container_name": "budge",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/budge:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/budge",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/budge/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": 80,
|
||||
"published_example": 80,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 443,
|
||||
"published_example": 443,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n budge:\n image: lscr.io/linuxserver/budge:latest\n container_name: budge\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/budge/config:/config\n ports:\n - 80:80\n - 443:443\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 80,
|
||||
"path": "/",
|
||||
"source": "compose-first-tcp-port-fallback"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,279 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-calibre-web",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Calibre Web"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Calibre-web is a web app providing a clean interface for browsing, reading and downloading eBooks using an existing Calibre database. It is also possible to integrate google drive and edit metadata and your calibre library through the app itself."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Calibre-web is a web app providing a clean interface for browsing, reading and downloading eBooks using an existing Calibre database. It is also possible to integrate google drive and edit metadata and your calibre library through the app itself."
|
||||
},
|
||||
"category": "media",
|
||||
"category_label": "Media & Streaming",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/calibre-web-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/calibre-web-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 8083,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://github.com/janeczku/calibre-web",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-calibre-web/",
|
||||
"repository": "https://github.com/linuxserver/docker-calibre-web",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2025-10-28",
|
||||
"note": "Add libxfixes3 and libasound2t64 to support epub to pdf conversion; also set --no-sandbox for qtwebengine."
|
||||
},
|
||||
{
|
||||
"date": "2025-01-07",
|
||||
"note": "Set kepubify path by default."
|
||||
},
|
||||
{
|
||||
"date": "2024-12-05",
|
||||
"note": "Rebase to noble."
|
||||
},
|
||||
{
|
||||
"date": "2024-08-26",
|
||||
"note": "Add new dep, xdg-utils."
|
||||
},
|
||||
{
|
||||
"date": "2024-07-07",
|
||||
"note": "Add new dep, libmagic1."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2025-10-28"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-calibre-web",
|
||||
"default_branch": "master",
|
||||
"revision": "6cf8ca68f272f1e5ffd1b673e9194a89e0162385",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-calibre-web/6cf8ca68f272f1e5ffd1b673e9194a89e0162385/README.md",
|
||||
"readme_pushed_at": "2026-09-06T04:54:26Z",
|
||||
"compose_sha256": "02a0710202f82692e0caaf389fd7c0bf0490ea54645130d5dc750067364e8079",
|
||||
"generated_at": "2026-09-12T14:37:24+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "calibre-web",
|
||||
"container_name": "calibre-web",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/calibre-web:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/calibre-web",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "DOCKER_MODS",
|
||||
"example": "linuxserver/mods:universal-calibre",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "OAUTHLIB_RELAX_TOKEN_SCOPE",
|
||||
"example": "1",
|
||||
"required": false,
|
||||
"sensitive": true,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/calibre-web/data",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 4
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-1",
|
||||
"container_path": "/books",
|
||||
"compose_source_example": "/path/to/calibre/library",
|
||||
"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": 8083,
|
||||
"published_example": 8083,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n calibre-web:\n image: lscr.io/linuxserver/calibre-web:latest\n container_name: calibre-web\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n - DOCKER_MODS=linuxserver/mods:universal-calibre #optional\n - OAUTHLIB_RELAX_TOKEN_SCOPE=1 #optional\n volumes:\n - /path/to/calibre-web/data:/config\n - /path/to/calibre/library:/books\n ports:\n - 8083:8083\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 8083,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"credentials": [
|
||||
{
|
||||
"label": "Default login",
|
||||
"username": "admin",
|
||||
"password": "admin123",
|
||||
"change_required": true,
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
]
|
||||
},
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,522 @@
|
||||
{
|
||||
"schema_version": "0.4.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-calibre",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Calibre"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Calibre is a powerful and easy to use e-book manager. Users say it's outstanding and a must-have. It'll allow you to do nearly everything and it takes things a step beyond normal e-book software. It's also completely free and open source and great for both casual users and computer experts."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Calibre is a powerful and easy to use e-book manager. Users say it's outstanding and a must-have. It'll allow you to do nearly everything and it takes things a step beyond normal e-book software. It's also completely free and open source and great for both casual users and computer experts."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/calibre-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/calibre-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 8181,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://calibre-ebook.com/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-calibre/",
|
||||
"repository": "https://github.com/linuxserver/docker-calibre",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-04-19",
|
||||
"note": "Rebase to resolute."
|
||||
},
|
||||
{
|
||||
"date": "2026-04-03",
|
||||
"note": "Make Wayland default disable with PIXELFLUX_WAYLAND=false."
|
||||
},
|
||||
{
|
||||
"date": "2025-12-28",
|
||||
"note": "Add Wayland init logic."
|
||||
},
|
||||
{
|
||||
"date": "2025-07-26",
|
||||
"note": "Rebase to selkies. Breaking Change: HTTPS is now required. Either use a reverse proxy with SSL cert or direct connect to port 8181 with HTTPS."
|
||||
},
|
||||
{
|
||||
"date": "2024-08-19",
|
||||
"note": "Rebase to noble."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-04-19"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-calibre",
|
||||
"default_branch": "master",
|
||||
"revision": "98221d60545c9fe8e48ab7fe228a5128516afe06",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-calibre/98221d60545c9fe8e48ab7fe228a5128516afe06/README.md",
|
||||
"readme_pushed_at": "2026-09-09T12:02:26Z",
|
||||
"compose_sha256": "e1fd4775d52a4f4dd89e7d54f800a43df01fc1ef886c48c5f2dc9725d88012a4",
|
||||
"generated_at": "2026-09-13T17:20:15+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "calibre",
|
||||
"container_name": "calibre",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/calibre:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/calibre",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PASSWORD",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": true,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "CLI_ARGS",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "LC_ALL",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "upstream-documentation",
|
||||
"prompt": "Language/locale (e.g. es_ES.UTF-8; translation of every application is not guaranteed)"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/calibre/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": 8080,
|
||||
"published_example": 8080,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 8181,
|
||||
"published_example": 8181,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 8081,
|
||||
"published_example": 8081,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n calibre:\n image: lscr.io/linuxserver/calibre:latest\n container_name: calibre\n security_opt:\n - seccomp:unconfined #optional\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n - PASSWORD= #optional\n - CLI_ARGS= #optional\n volumes:\n - /path/to/calibre/config:/config\n ports:\n - 8080:8080\n - 8181:8181\n - 8081:8081\n shm_size: \"1gb\"\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 8181,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"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"
|
||||
},
|
||||
"installer_profile": {
|
||||
"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"
|
||||
]
|
||||
},
|
||||
{
|
||||
"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"
|
||||
]
|
||||
}
|
||||
],
|
||||
"security": {
|
||||
"optional_relaxations": [
|
||||
{
|
||||
"id": "seccomp-unconfined",
|
||||
"enable_prompt": "Apply optional security relaxation seccomp:unconfined",
|
||||
"enabled_default": false,
|
||||
"options": {
|
||||
"seccomp_profile": "unconfined"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"selkies": {
|
||||
"base": "FROM ghcr.io/linuxserver/baseimage-selkies:ubunturesolute",
|
||||
"dockerfile_url": "https://raw.githubusercontent.com/linuxserver/docker-calibre/master/Dockerfile",
|
||||
"dockerfile_sha256": "796c5ec2f20a2f4d6e7a58b3f5a0f6b171276301aee42a0ca81e9610128b5730",
|
||||
"reviewed_on": "2026-09-16",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/",
|
||||
"nvidia": "not-offered-until-specific-host-and-image-validation",
|
||||
"validation": "profile-generated; real streaming workload pending"
|
||||
},
|
||||
"optional_devices": [],
|
||||
"hardware_acceleration": {
|
||||
"prompt": "Selkies desktop and streaming acceleration",
|
||||
"default": "none",
|
||||
"profiles": [
|
||||
{
|
||||
"id": "none",
|
||||
"label": "No GPU (CPU)",
|
||||
"device_requests": [],
|
||||
"environment": [
|
||||
{
|
||||
"name": "AUTO_GPU",
|
||||
"value": "false"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "vaapi",
|
||||
"label": "Intel/AMD (streaming rendering and encoding)",
|
||||
"device_requests": [
|
||||
{
|
||||
"id": "selkies-render",
|
||||
"kind": "character-device",
|
||||
"path_prompt": "Intel/AMD render node",
|
||||
"host_path_default": "/dev/dri/renderD128",
|
||||
"container_path_strategy": "same-as-host",
|
||||
"mode": "0660",
|
||||
"deny_write": false,
|
||||
"gid_strategy": "host-device-gid",
|
||||
"drm_vendor_ids": [
|
||||
"0x8086",
|
||||
"0x1002"
|
||||
]
|
||||
}
|
||||
],
|
||||
"environment": [
|
||||
{
|
||||
"name": "PIXELFLUX_WAYLAND",
|
||||
"value": "true"
|
||||
},
|
||||
{
|
||||
"name": "AUTO_GPU",
|
||||
"value": "false"
|
||||
}
|
||||
],
|
||||
"environment_from_devices": {
|
||||
"DRINODE": [
|
||||
"selkies-render"
|
||||
],
|
||||
"DRI_NODE": [
|
||||
"selkies-render"
|
||||
],
|
||||
"ATTACHED_DEVICES_PERMS": [
|
||||
"selkies-render"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"gpu_validation": {
|
||||
"device_inventory": "host-sysfs-and-stat",
|
||||
"application_acceleration": "requires-workload-test",
|
||||
"tone_mapping": "not-implied-by-device-access"
|
||||
},
|
||||
"device_permissions": {
|
||||
"strategy": "linuxserver-native-init",
|
||||
"service_user": "abc",
|
||||
"environment": "ATTACHED_DEVICES_PERMS",
|
||||
"paths": "all-resolved-selected-character-devices"
|
||||
}
|
||||
},
|
||||
"security_profile": {
|
||||
"requires_privileged_lxc": false,
|
||||
"source_requests_privileged_lxc": false,
|
||||
"optional_privileged_lxc": false,
|
||||
"requires_host_pid_namespace": false,
|
||||
"source_requests_relaxed_confinement": true,
|
||||
"requires_relaxed_confinement": false,
|
||||
"optional_relaxed_confinement": true,
|
||||
"risk_level": "high",
|
||||
"confirmation_required": false,
|
||||
"warning": "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."
|
||||
},
|
||||
"adaptations": [
|
||||
{
|
||||
"id": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-command",
|
||||
"upstream_behavior": "Compose replaces the image Cmd while retaining its Entrypoint.",
|
||||
"native_lxc_behavior": "ProxMenux reads the official OCI Entrypoint and combines it with the Compose command as the native LXC init command.",
|
||||
"reason": "Proxmox stores the effective OCI process as one entrypoint string.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-process-runtime",
|
||||
"upstream_behavior": "Compose can replace Entrypoint, User and WorkingDir and request an init process or interactive terminal.",
|
||||
"native_lxc_behavior": "ProxMenux applies the process overrides through native LXC init directives; lxc-init provides PID 1 supervision and the CT console provides terminal access.",
|
||||
"reason": "The OCI process must start with the same identity, command and working directory without Docker.",
|
||||
"behavioral_impact": "Compose stdin_open and tty become access through the Proxmox LXC console.",
|
||||
"validation": "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-network-identity",
|
||||
"upstream_behavior": "Compose can set hostname, MAC address, extra hosts and attach a service to Docker networks.",
|
||||
"native_lxc_behavior": "ProxMenux applies hostname and MAC to net0, writes additional host aliases into the LXC and uses its dedicated bridge connection for single-service networks.",
|
||||
"reason": "A dedicated LXC has its own network namespace and does not need a Docker bridge per service.",
|
||||
"behavioral_impact": "host-gateway resolves to the IPv4 address of the selected Proxmox bridge.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-network-mode",
|
||||
"upstream_behavior": "Docker host mode removes Docker network isolation; bridge and default use a Docker-managed network.",
|
||||
"native_lxc_behavior": "The OCI process uses the dedicated LXC network namespace directly, so host, bridge and default all listen on the LXC address without Docker NAT.",
|
||||
"reason": "The LXC is the application host and already has its own address and port namespace.",
|
||||
"behavioral_impact": "host means the LXC host, never the Proxmox host; this preserves Proxmox network isolation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-capabilities-and-sysctls",
|
||||
"upstream_behavior": "Compose can add Linux capabilities and set kernel parameters in the container network namespace.",
|
||||
"native_lxc_behavior": "ProxMenux validates requested capabilities against the native LXC capability set and writes namespaced network settings as lxc.sysctl directives.",
|
||||
"reason": "A native OCI-LXC already starts with the namespaced capability set; lxc.cap.keep would incorrectly discard unrelated required capabilities.",
|
||||
"behavioral_impact": "Host-global capabilities such as SYS_MODULE remain blocked until their host prerequisite is explicitly adapted.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"cap_add",
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"group_add",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"security_opt",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"sysctls",
|
||||
"tty",
|
||||
"user",
|
||||
"volumes",
|
||||
"working_dir"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,373 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-calligra",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Calligra"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Calligra is an office and graphic art suite by KDE. It is available for desktop PCs, tablet computers, and smartphones. It contains applications for word processing, spreadsheets, presentation, vector graphics, and editing databases."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Calligra is an office and graphic art suite by KDE. It is available for desktop PCs, tablet computers, and smartphones. It contains applications for word processing, spreadsheets, presentation, vector graphics, and editing databases."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/calligra-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/calligra-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://calligra.org/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-calligra/",
|
||||
"repository": "https://github.com/linuxserver/docker-calligra",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-03-30",
|
||||
"note": "Make Wayland default disable with PIXELFLUX_WAYLAND=false."
|
||||
},
|
||||
{
|
||||
"date": "2025-12-28",
|
||||
"note": "Add Wayland init logic."
|
||||
},
|
||||
{
|
||||
"date": "2025-09-22",
|
||||
"note": "Rebase to Debian Trixie."
|
||||
},
|
||||
{
|
||||
"date": "2025-07-12",
|
||||
"note": "Rebase to Selkies, HTTPS IS NOW REQUIRED."
|
||||
},
|
||||
{
|
||||
"date": "2024-02-10",
|
||||
"note": "Update Readme with new env vars and ingest proper PWA icon."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-03-30"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-calligra",
|
||||
"default_branch": "master",
|
||||
"revision": "23fceaf96061494ab6e5fa051a45c427c63e4e37",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-calligra/23fceaf96061494ab6e5fa051a45c427c63e4e37/README.md",
|
||||
"readme_pushed_at": "2026-09-10T14:06:16Z",
|
||||
"compose_sha256": "3601c4ff56d52d7b2170968241ecfe3fa59e07692d5a637e102e010b09258b01",
|
||||
"generated_at": "2026-09-12T14:37:24+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "calligra",
|
||||
"container_name": "calligra",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/calligra:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/calligra",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "LC_ALL",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "upstream-documentation",
|
||||
"prompt": "Language/locale (e.g. es_ES.UTF-8; translation of every application is not guaranteed)"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/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": 3000,
|
||||
"published_example": 3000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 3001,
|
||||
"published_example": 3001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n calligra:\n image: lscr.io/linuxserver/calligra:latest\n container_name: calligra\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/config:/config\n ports:\n - 3000:3000\n - 3001:3001\n shm_size: \"1gb\"\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
}
|
||||
],
|
||||
"installer_profile": {
|
||||
"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"
|
||||
]
|
||||
},
|
||||
{
|
||||
"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"
|
||||
]
|
||||
}
|
||||
],
|
||||
"selkies": {
|
||||
"base": "FROM ghcr.io/linuxserver/baseimage-selkies:debiantrixie",
|
||||
"dockerfile_url": "https://raw.githubusercontent.com/linuxserver/docker-calligra/master/Dockerfile",
|
||||
"dockerfile_sha256": "01cf24c40c88e48b5329fcf6fe5d95e74312ea327a11cb7c3ca6dd1fb24c4cb9",
|
||||
"reviewed_on": "2026-09-16",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/",
|
||||
"nvidia": "not-offered-until-specific-host-and-image-validation",
|
||||
"validation": "profile-generated; real streaming workload pending"
|
||||
},
|
||||
"optional_devices": [],
|
||||
"hardware_acceleration": {
|
||||
"prompt": "Selkies desktop and streaming acceleration",
|
||||
"default": "none",
|
||||
"profiles": [
|
||||
{
|
||||
"id": "none",
|
||||
"label": "No GPU (CPU)",
|
||||
"device_requests": [],
|
||||
"environment": [
|
||||
{
|
||||
"name": "AUTO_GPU",
|
||||
"value": "false"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "vaapi",
|
||||
"label": "Intel/AMD (streaming rendering and encoding)",
|
||||
"device_requests": [
|
||||
{
|
||||
"id": "selkies-render",
|
||||
"kind": "character-device",
|
||||
"path_prompt": "Intel/AMD render node",
|
||||
"host_path_default": "/dev/dri/renderD128",
|
||||
"container_path_strategy": "same-as-host",
|
||||
"mode": "0660",
|
||||
"deny_write": false,
|
||||
"gid_strategy": "host-device-gid",
|
||||
"drm_vendor_ids": [
|
||||
"0x8086",
|
||||
"0x1002"
|
||||
]
|
||||
}
|
||||
],
|
||||
"environment": [
|
||||
{
|
||||
"name": "PIXELFLUX_WAYLAND",
|
||||
"value": "true"
|
||||
},
|
||||
{
|
||||
"name": "AUTO_GPU",
|
||||
"value": "false"
|
||||
}
|
||||
],
|
||||
"environment_from_devices": {
|
||||
"DRINODE": [
|
||||
"selkies-render"
|
||||
],
|
||||
"DRI_NODE": [
|
||||
"selkies-render"
|
||||
],
|
||||
"ATTACHED_DEVICES_PERMS": [
|
||||
"selkies-render"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"gpu_validation": {
|
||||
"device_inventory": "host-sysfs-and-stat",
|
||||
"application_acceleration": "requires-workload-test",
|
||||
"tone_mapping": "not-implied-by-device-access"
|
||||
},
|
||||
"device_permissions": {
|
||||
"strategy": "linuxserver-native-init",
|
||||
"service_user": "abc",
|
||||
"environment": "ATTACHED_DEVICES_PERMS",
|
||||
"paths": "all-resolved-selected-character-devices"
|
||||
}
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"shm_size",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,255 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-changedetection-io",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Changedetection.Io"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Changedetection.io provides free, open-source web page monitoring, notification and change detection."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Changedetection.io provides free, open-source web page monitoring, notification and change detection."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/changedetection.io-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/changedetection.io-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 5000,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://github.com/dgtlmoon/changedetection.io",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-changedetection.io/",
|
||||
"repository": "https://github.com/linuxserver/docker-changedetection.io",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-02-18",
|
||||
"note": "Rebase to Alpine 3.23."
|
||||
},
|
||||
{
|
||||
"date": "2025-07-05",
|
||||
"note": "Rebase to Alpine 3.22."
|
||||
},
|
||||
{
|
||||
"date": "2024-12-19",
|
||||
"note": "Rebase to Alpine 3.21."
|
||||
},
|
||||
{
|
||||
"date": "2024-05-31",
|
||||
"note": "Rebase to Alpine 3.20."
|
||||
},
|
||||
{
|
||||
"date": "2024-03-09",
|
||||
"note": "Build Playwright from source because Microsoft's build and packaging process is awful."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-02-18"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-changedetection.io",
|
||||
"default_branch": "main",
|
||||
"revision": "dfd70e0e7be8f0e5fa49a2d01c4e59fee3543cd0",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-changedetection.io/dfd70e0e7be8f0e5fa49a2d01c4e59fee3543cd0/README.md",
|
||||
"readme_pushed_at": "2026-09-10T10:18:30Z",
|
||||
"compose_sha256": "441c4f6be9216566c29c73618c56d3e1a442dcf1cb45fab4b1d0f55eadadd825",
|
||||
"generated_at": "2026-09-12T14:37:24+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "changedetection",
|
||||
"container_name": "changedetection",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/changedetection.io:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/changedetection.io",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "BASE_URL",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PLAYWRIGHT_DRIVER_URL",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/changedetection/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": 5000,
|
||||
"published_example": 5000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n changedetection:\n image: lscr.io/linuxserver/changedetection.io:latest\n container_name: changedetection\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n - BASE_URL= #optional\n - PLAYWRIGHT_DRIVER_URL= #optional\n volumes:\n - /path/to/changedetection/config:/config\n ports:\n - 5000:5000\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 5000,
|
||||
"path": "/",
|
||||
"source": "compose-first-tcp-port-fallback"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,385 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-chatbot-ui",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Chatbot UI"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Open source chat UI for AI models"
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Chatbot UI is an open source chat UI for AI models."
|
||||
},
|
||||
"category": "ai",
|
||||
"category_label": "AI / Coding & Dev-Tools",
|
||||
"author": "Mckay Wrigley",
|
||||
"developer": "Mckay Wrigley",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 3000,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://www.chatbotui.com",
|
||||
"documentation": null,
|
||||
"repository": "https://ghcr.io/mckaywrigley/chatbot-ui",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "mckaywrigley",
|
||||
"repository": "https://ghcr.io/mckaywrigley/chatbot-ui",
|
||||
"revision": "48fafac56d17a021d929ffeba51168ad56dfab1d9093b28a1d9c4d6478c72746",
|
||||
"image_repository_url": "https://ghcr.io/mckaywrigley/chatbot-ui",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "48fafac56d17a021d929ffeba51168ad56dfab1d9093b28a1d9c4d6478c72746",
|
||||
"generated_at": "2026-09-13T15:34:57+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "chatbot-ui",
|
||||
"container_name": "chatbot-ui",
|
||||
"image": {
|
||||
"reference": "ghcr.io/mckaywrigley/chatbot-ui:latest",
|
||||
"registry": "ghcr.io",
|
||||
"repository": "ghcr.io/mckaywrigley/chatbot-ui",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "$PGID",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "$PUID",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "$TZ",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [],
|
||||
"ports": [
|
||||
{
|
||||
"container_port": 3000,
|
||||
"published_example": 3080,
|
||||
"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: chatbot-ui\nservices:\n chatbot-ui:\n environment:\n PGID: $PGID\n PUID: $PUID\n TZ: $TZ\n image: ghcr.io/mckaywrigley/chatbot-ui:latest\n network_mode: bridge\n ports:\n - target: 3000\n published: '3080'\n protocol: tcp\n restart: unless-stopped\n container_name: chatbot-ui\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "chatbot-ui",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "chatbot-ui",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "chatbot-ui",
|
||||
"image": "ghcr.io/mckaywrigley/chatbot-ui:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"environment": {
|
||||
"PGID": "$PGID",
|
||||
"PUID": "$PUID",
|
||||
"TZ": "$TZ"
|
||||
},
|
||||
"image": "ghcr.io/mckaywrigley/chatbot-ui:latest",
|
||||
"network_mode": "bridge",
|
||||
"ports": [
|
||||
{
|
||||
"target": 3000,
|
||||
"published": "3080",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"restart": "unless-stopped",
|
||||
"container_name": "chatbot-ui"
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "chatbot-ui"
|
||||
},
|
||||
"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": [
|
||||
"chatbot-ui"
|
||||
],
|
||||
"stop_order": [
|
||||
"chatbot-ui"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 3000,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"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,416 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-chatgpt-next-web",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "ChatGPT Next Web"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "A well-designed cross-platform ChatGPT UI."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "An intelligent chat application based on ChatGPT, supports fast deployment, Markdown, beautiful UI, fluid response, privacy and security, and allows customization of preset roles for quick creation, sharing, and debugging of personalized conversations."
|
||||
},
|
||||
"category": "ai",
|
||||
"category_label": "AI / Coding & Dev-Tools",
|
||||
"author": "Yidadaa",
|
||||
"developer": "Yidadaa",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 3000,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://nextchat.club",
|
||||
"documentation": null,
|
||||
"repository": "https://hub.docker.com/r/yidadaa/chatgpt-next-web",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "yidadaa",
|
||||
"repository": "https://hub.docker.com/r/yidadaa/chatgpt-next-web",
|
||||
"revision": "d27148d56629c341835e1833824f2340d4a13e915a929f0f6ee432b4a2e31194",
|
||||
"image_repository_url": "https://hub.docker.com/r/yidadaa/chatgpt-next-web",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "d27148d56629c341835e1833824f2340d4a13e915a929f0f6ee432b4a2e31194",
|
||||
"generated_at": "2026-09-13T15:34:57+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "chatgpt-next-web",
|
||||
"container_name": "chatgpt-next-web",
|
||||
"image": {
|
||||
"reference": "yidadaa/chatgpt-next-web:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "yidadaa/chatgpt-next-web",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "$PGID",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "$PUID",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "$TZ",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "CODE",
|
||||
"example": "",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "PROXY_URL",
|
||||
"example": "",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "BASE_URL",
|
||||
"example": "https://api.openai.com",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [],
|
||||
"ports": [
|
||||
{
|
||||
"container_port": 3000,
|
||||
"published_example": 3000,
|
||||
"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: chatgpt-next-web\nservices:\n chatgpt-next-web:\n environment:\n PGID: $PGID\n PUID: $PUID\n TZ: $TZ\n CODE: ''\n PROXY_URL: ''\n BASE_URL: https://api.openai.com\n image: yidadaa/chatgpt-next-web:latest\n deploy:\n resources:\n reservations:\n memory: 64M\n network_mode: bridge\n ports:\n - target: 3000\n published: '3000'\n protocol: tcp\n restart: unless-stopped\n container_name: chatgpt-next-web\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "chatgpt-next-web",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "chatgpt-next-web",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "chatgpt-next-web",
|
||||
"image": "yidadaa/chatgpt-next-web:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"environment": {
|
||||
"PGID": "$PGID",
|
||||
"PUID": "$PUID",
|
||||
"TZ": "$TZ",
|
||||
"CODE": "",
|
||||
"PROXY_URL": "",
|
||||
"BASE_URL": "https://api.openai.com"
|
||||
},
|
||||
"image": "yidadaa/chatgpt-next-web:latest",
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "64M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"network_mode": "bridge",
|
||||
"ports": [
|
||||
{
|
||||
"target": 3000,
|
||||
"published": "3000",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"restart": "unless-stopped",
|
||||
"container_name": "chatgpt-next-web"
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "chatgpt-next-web"
|
||||
},
|
||||
"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": [
|
||||
"chatgpt-next-web"
|
||||
],
|
||||
"stop_order": [
|
||||
"chatgpt-next-web"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 3000,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"credentials": []
|
||||
},
|
||||
"proxmox": {
|
||||
"runtime": "native-oci-lxc",
|
||||
"technology_status": "proxmox-technology-preview",
|
||||
"defaults": {
|
||||
"unprivileged": true,
|
||||
"ostype": "auto-from-image",
|
||||
"cores": 2,
|
||||
"memory_mb": 128,
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"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,280 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-chrome",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Chrome"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Chrome is the official web browser from Google, built to be fast, secure, and customizable."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Chrome is the official web browser from Google, built to be fast, secure, and customizable."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/chrome-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/chrome-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://www.google.com/chrome/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-chrome/",
|
||||
"repository": "https://github.com/linuxserver/docker-chrome",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-07-27",
|
||||
"note": "Add aarch64 support."
|
||||
},
|
||||
{
|
||||
"date": "2026-03-31",
|
||||
"note": "Make Wayland default disable with PIXELFLUX_WAYLAND=false."
|
||||
},
|
||||
{
|
||||
"date": "2025-12-20",
|
||||
"note": "Add Wayland init logic."
|
||||
},
|
||||
{
|
||||
"date": "2025-09-22",
|
||||
"note": "Rebase to Debian Trixie."
|
||||
},
|
||||
{
|
||||
"date": "2025-09-02",
|
||||
"note": "Revert graceful shutdown script to rely on the baseimage fix."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-07-27"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-chrome",
|
||||
"default_branch": "master",
|
||||
"revision": "0ca44c4169138d8d0f4abf2cb97595b6b360d471",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-chrome/0ca44c4169138d8d0f4abf2cb97595b6b360d471/README.md",
|
||||
"readme_pushed_at": "2026-09-09T00:55:14Z",
|
||||
"compose_sha256": "a3e7b9f8e1868c875558ffb5c3f41734bb9cc5c8585a776b847b52bad5c2d369",
|
||||
"generated_at": "2026-09-12T14:37:24+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "chrome",
|
||||
"container_name": "chrome",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/chrome:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/chrome",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "CHROME_CLI",
|
||||
"example": "https://www.linuxserver.io/",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/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": 3000,
|
||||
"published_example": 3000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 3001,
|
||||
"published_example": 3001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n chrome:\n image: lscr.io/linuxserver/chrome:latest\n container_name: chrome\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n - CHROME_CLI=https://www.linuxserver.io/ #optional\n volumes:\n - /path/to/config:/config\n ports:\n - 3000:3000\n - 3001:3001\n shm_size: \"1gb\"\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
}
|
||||
],
|
||||
"installer_profile": {
|
||||
"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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"shm_size",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,280 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-chromium",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Chromium"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "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."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "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."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/chromium-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/chromium-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://www.chromium.org/chromium-projects/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-chromium/",
|
||||
"repository": "https://github.com/linuxserver/docker-chromium",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-07-04",
|
||||
"note": "Deprecate Kasm branch."
|
||||
},
|
||||
{
|
||||
"date": "2026-03-31",
|
||||
"note": "Make Wayland default disable with PIXELFLUX_WAYLAND=false."
|
||||
},
|
||||
{
|
||||
"date": "2025-12-20",
|
||||
"note": "Add Wayland init logic."
|
||||
},
|
||||
{
|
||||
"date": "2025-09-22",
|
||||
"note": "Rebase to Debian Trixie."
|
||||
},
|
||||
{
|
||||
"date": "2025-07-01",
|
||||
"note": "Add Kasm branch."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-07-04"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-chromium",
|
||||
"default_branch": "master",
|
||||
"revision": "dd4df02a9614d2107ae303a77b5e309c5ceee12d",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-chromium/dd4df02a9614d2107ae303a77b5e309c5ceee12d/README.md",
|
||||
"readme_pushed_at": "2026-09-09T14:32:01Z",
|
||||
"compose_sha256": "25230baee43f5718a8571dfcc45149623d11568325068f1b3c456cc0e1d65bdb",
|
||||
"generated_at": "2026-09-12T14:37:24+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "chromium",
|
||||
"container_name": "chromium",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/chromium:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/chromium",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "CHROME_CLI",
|
||||
"example": "https://www.linuxserver.io/",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/chromium/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": 3000,
|
||||
"published_example": 3000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 3001,
|
||||
"published_example": 3001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n chromium:\n image: lscr.io/linuxserver/chromium:latest\n container_name: chromium\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n - CHROME_CLI=https://www.linuxserver.io/ #optional\n volumes:\n - /path/to/chromium/config:/config\n ports:\n - 3000:3000\n - 3001:3001\n shm_size: \"1gb\"\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
}
|
||||
],
|
||||
"installer_profile": {
|
||||
"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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"shm_size",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,403 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-cloudbeaver",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "CloudBeaver"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Cloud Database Manager."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "CloudBeaver is a web-based database GUI tool which provides rich web interface. You can use it to manage PostgreSQL, MySQL, MariaDB, SQL Server, Oracle, DB2, Firebird, H2, Trino."
|
||||
},
|
||||
"category": "ai",
|
||||
"category_label": "AI / Coding & Dev-Tools",
|
||||
"author": "dbeaver",
|
||||
"developer": "dbeaver",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 8978,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://dbeaver.com/download/cloudbeaver/",
|
||||
"documentation": null,
|
||||
"repository": "https://hub.docker.com/r/dbeaver/cloudbeaver",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "official",
|
||||
"repository": "https://hub.docker.com/r/dbeaver/cloudbeaver",
|
||||
"revision": "d227261123f35eaf91ba08a9383415670a97a16d7e4e59699bbb4690d538bfb9",
|
||||
"image_repository_url": "https://hub.docker.com/r/dbeaver/cloudbeaver",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "d227261123f35eaf91ba08a9383415670a97a16d7e4e59699bbb4690d538bfb9",
|
||||
"generated_at": "2026-09-13T15:34:57+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "cloudbeaver",
|
||||
"container_name": "cloudbeaver",
|
||||
"image": {
|
||||
"reference": "dbeaver/cloudbeaver:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "dbeaver/cloudbeaver",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/opt/cloudbeaver/workspace",
|
||||
"compose_source_example": "/DATA/AppData/$AppID/workspace",
|
||||
"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": 8978,
|
||||
"published_example": 8978,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "version: '3.7'\nname: cloudbeaver\nservices:\n cloudbeaver:\n container_name: cloudbeaver\n deploy:\n resources:\n reservations:\n memory: 256M\n image: dbeaver/cloudbeaver:latest\n ports:\n - target: 8978\n published: '8978'\n protocol: tcp\n restart: unless-stopped\n volumes:\n - type: bind\n source: /DATA/AppData/$AppID/workspace\n target: /opt/cloudbeaver/workspace\n network_mode: bridge\n privileged: false\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "cloudbeaver",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "cloudbeaver",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "cloudbeaver",
|
||||
"image": "dbeaver/cloudbeaver:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"container_name": "cloudbeaver",
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "256M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"image": "dbeaver/cloudbeaver:latest",
|
||||
"ports": [
|
||||
{
|
||||
"target": 8978,
|
||||
"published": "8978",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"restart": "unless-stopped",
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/workspace",
|
||||
"target": "/opt/cloudbeaver/workspace"
|
||||
}
|
||||
],
|
||||
"network_mode": "bridge",
|
||||
"privileged": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"version": "3.7",
|
||||
"name": "cloudbeaver"
|
||||
},
|
||||
"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": "cloudbeaver-volume-0",
|
||||
"service": "cloudbeaver",
|
||||
"container_path": "/opt/cloudbeaver/workspace",
|
||||
"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": [
|
||||
"cloudbeaver"
|
||||
],
|
||||
"stop_order": [
|
||||
"cloudbeaver"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 8978,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"credentials": []
|
||||
},
|
||||
"proxmox": {
|
||||
"runtime": "native-oci-lxc",
|
||||
"technology_status": "proxmox-technology-preview",
|
||||
"defaults": {
|
||||
"unprivileged": true,
|
||||
"ostype": "auto-from-image",
|
||||
"cores": 2,
|
||||
"memory_mb": 256,
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"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,394 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-cloudflared",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Cloudflared"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "A tunneling daemon by Cloudflare that safely exposes your web servers into the internet."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Cloudflare Tunnel offers an easy way to expose web servers securely to the internet, without opening up firewall ports and configuring ACLs. Cloudflare Tunnel also ensures requests route through Cloudflare before reaching the web server, so you can be sure attack traffic is stopped with Cloudflare\u2019s WAF and Unmetered DDoS mitigation, and authenticated with Access if you\u2019ve enabled those features for your account.\n\nThe software provides a seamless way to securely expose web servers to the internet without configuring firewall ports or access control lists (ACLs). All requests are routed through Cloudflare before reaching your web server, leveraging Cloudflare\u2019s Web Application Firewall (WAF) and unmetered DDoS mitigation to block attack traffic, with optional authentication via Cloudflare Access if enabled. With its intuitive Web interface and efficient tunnel management, this tool is the perfect solution for securely deploying web services.\n\n**Discover How to Connect self-hosted server to Cloudflare Tunnel**\nIntegrating self-hosted server with Cloudflare Tunnel allows you to securely expose local services to the internet without opening firewall ports, enabling seamless remote access. Below are two practical resources to guide you through the setup process:\n1. [**Cloudflare Official Tutorial**](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/get-started/create-remote-tunnel/): \n This tutorial provides detailed steps for creating and managing a Cloudflare Tunnel.\n2. [**Phiptech Practical Guide**](https://phiptech.com/how-to-setup-cloudflare-tunnel-and-expose-your-local-service-or-application/): \n This guide offers a concise, step-by-step walkthrough for setting up Cloudflare Tunnel on local devices like self-hosted server, with practical examples to help users easily expose services to the public internet.\n"
|
||||
},
|
||||
"category": "web",
|
||||
"category_label": "Webservers & Proxies",
|
||||
"author": "Cloudflare Inc.",
|
||||
"developer": "Cloudflare Inc.",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 14333,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/get-started/create-remote-tunnel/",
|
||||
"documentation": null,
|
||||
"repository": "https://hub.docker.com/r/wisdomsky/cloudflared-web",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "wisdomsky",
|
||||
"repository": "https://hub.docker.com/r/wisdomsky/cloudflared-web",
|
||||
"revision": "47fa44796989402418ef8b7b862a52ebd8ec3f098437c9dbc84bbdd9dea072eb",
|
||||
"image_repository_url": "https://hub.docker.com/r/wisdomsky/cloudflared-web",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "47fa44796989402418ef8b7b862a52ebd8ec3f098437c9dbc84bbdd9dea072eb",
|
||||
"generated_at": "2026-09-13T15:34:59+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "cloudflared",
|
||||
"container_name": "cloudflared",
|
||||
"image": {
|
||||
"reference": "wisdomsky/cloudflared-web:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "wisdomsky/cloudflared-web",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/DATA/AppData/cloudflared-cloudflared/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": 14333,
|
||||
"published_example": 14333,
|
||||
"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: cloudflared\nservices:\n cloudflared:\n image: wisdomsky/cloudflared-web:latest\n restart: unless-stopped\n network_mode: host\n ports:\n - target: 14333\n published: '14333'\n protocol: tcp\n volumes:\n - type: bind\n source: /DATA/AppData/cloudflared-cloudflared/config\n target: /config\n container_name: cloudflared\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "cloudflared",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "cloudflared",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "cloudflared",
|
||||
"image": "wisdomsky/cloudflared-web:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"image": "wisdomsky/cloudflared-web:latest",
|
||||
"restart": "unless-stopped",
|
||||
"network_mode": "host",
|
||||
"ports": [
|
||||
{
|
||||
"target": 14333,
|
||||
"published": "14333",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/cloudflared-cloudflared/config",
|
||||
"target": "/config"
|
||||
}
|
||||
],
|
||||
"container_name": "cloudflared"
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "cloudflared"
|
||||
},
|
||||
"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": "cloudflared-volume-0",
|
||||
"service": "cloudflared",
|
||||
"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": [
|
||||
"cloudflared"
|
||||
],
|
||||
"stop_order": [
|
||||
"cloudflared"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 14333,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"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,662 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-clumoove",
|
||||
"status": "generated-review-required",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Clumoove"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Self-hosted cloud data migration & sync manager"
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Clumoove is a modern, self-hosted cloud data migration and synchronization platform for files, calendars, and contacts.\n\nEasily connect, transfer, and synchronize data between cloud storage providers including Nextcloud, Google Drive, Dropbox, OneDrive, HiDrive, S3, WebDAV, SMB, SFTP, FTP, Immich, Seafile, Koofr, MEGA, and local storage.\n\nKey Features:\n- Zero-disk streaming transfers (no local temporary storage retention during migration)\n- Multi-threaded background migrations and cron-based synchronization schedules\n- Robust 3-way hash integrity verification & flexible conflict resolution\n- Integrated cloud file manager with multi-format previews and thumbnails\n- Multi-channel notification delivery (Gotify, ntfy, Telegram, Discord, Email)\n- Enterprise-grade security with AES-256-GCM encryption, TOTP 2FA, and audit logging\n"
|
||||
},
|
||||
"category": "productivity",
|
||||
"category_label": "Productivity & Workflows",
|
||||
"author": "Marcel Meyer",
|
||||
"developer": "Marcel Meyer",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 3000,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://clumoove.com",
|
||||
"documentation": null,
|
||||
"repository": "https://ghcr.io/xxroxxerxx/clumoove-frontend",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null,
|
||||
"hidden": true,
|
||||
"hidden_reason": "Pending multi-container adaptation; retained for future work"
|
||||
},
|
||||
"source": {
|
||||
"provider": "xxroxxerxx",
|
||||
"repository": "https://ghcr.io/xxroxxerxx/clumoove-frontend",
|
||||
"revision": "acfa54e4400a05629416ca1b2077236d4e4cb7217a1c7b20547ab43ea20a1679",
|
||||
"image_repository_url": "https://ghcr.io/xxroxxerxx/clumoove-frontend",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "acfa54e4400a05629416ca1b2077236d4e4cb7217a1c7b20547ab43ea20a1679",
|
||||
"generated_at": "2026-09-13T15:48:22+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "frontend",
|
||||
"container_name": "clumoove-frontend",
|
||||
"image": {
|
||||
"reference": "ghcr.io/xxroxxerxx/clumoove-frontend:latest",
|
||||
"registry": "ghcr.io",
|
||||
"repository": "ghcr.io/xxroxxerxx/clumoove-frontend",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "CLUMOOVE_API_URL",
|
||||
"example": "",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [],
|
||||
"ports": [
|
||||
{
|
||||
"container_port": 3000,
|
||||
"published_example": 8380,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [
|
||||
{
|
||||
"name": "api-backend",
|
||||
"image": "ghcr.io/xxroxxerxx/clumoove-api:latest"
|
||||
},
|
||||
{
|
||||
"name": "migration-worker",
|
||||
"image": "ghcr.io/xxroxxerxx/clumoove-worker:latest"
|
||||
},
|
||||
{
|
||||
"name": "postgres-db",
|
||||
"image": "postgres:latest"
|
||||
},
|
||||
{
|
||||
"name": "redis-queue",
|
||||
"image": "redis:latest"
|
||||
}
|
||||
],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "name: clumoove\nservices:\n frontend:\n image: ghcr.io/xxroxxerxx/clumoove-frontend:latest\n container_name: clumoove-frontend\n restart: unless-stopped\n ports:\n - target: 3000\n published: '8380'\n protocol: tcp\n environment:\n - CLUMOOVE_API_URL=\n depends_on:\n - api-backend\n networks:\n - clumoove-network\n api-backend:\n image: ghcr.io/xxroxxerxx/clumoove-api:latest\n container_name: clumoove-api\n restart: unless-stopped\n environment:\n - DATABASE_URL=postgres://clumoove:clumoove_secure_password_default@postgres-db:5432/cloud_migration_db?sslmode=disable\n - REDIS_URL=redis://:clumoove_secure_redis_pass@redis-queue:6379\n - PORT=8000\n - ENCRYPTION_SECRET_KEY=${GENERATED_ENCRYPTION_SECRET_KEY}\n - JWT_SECRET_KEY=${GENERATED_JWT_SECRET_KEY}\n - TRUSTED_PROXY=1\n - LOCAL_STORAGE_ROOT=/clumoove\n volumes:\n - type: bind\n source: /DATA/AppData/clumoove/storage\n target: /clumoove\n depends_on:\n - postgres-db\n - redis-queue\n networks:\n - clumoove-network\n migration-worker:\n image: ghcr.io/xxroxxerxx/clumoove-worker:latest\n container_name: clumoove-worker\n restart: unless-stopped\n command:\n - /app/worker\n environment:\n - DATABASE_URL=postgres://clumoove:clumoove_secure_password_default@postgres-db:5432/cloud_migration_db?sslmode=disable\n - REDIS_URL=redis://:clumoove_secure_redis_pass@redis-queue:6379\n - ENCRYPTION_SECRET_KEY=${GENERATED_ENCRYPTION_SECRET_KEY}\n - LOCAL_STORAGE_ROOT=/clumoove\n volumes:\n - type: bind\n source: /DATA/AppData/clumoove/storage\n target: /clumoove\n depends_on:\n - postgres-db\n - redis-queue\n networks:\n - clumoove-network\n postgres-db:\n image: postgres:latest\n container_name: clumoove-postgres\n restart: unless-stopped\n command:\n - postgres\n - -c\n - max_connections=300\n environment:\n POSTGRES_USER: clumoove\n POSTGRES_PASSWORD: ${GENERATED_POSTGRES_PASSWORD}\n POSTGRES_DB: cloud_migration_db\n volumes:\n - type: bind\n source: /DATA/AppData/clumoove/postgres\n target: /var/lib/postgresql/data\n networks:\n - clumoove-network\n redis-queue:\n image: redis:latest\n container_name: clumoove-redis\n restart: unless-stopped\n command: redis-server --appendonly yes --requirepass \"clumoove_secure_redis_pass\"\n --bind 0.0.0.0\n volumes:\n - type: bind\n source: /DATA/AppData/clumoove/redis\n target: /data\n networks:\n - clumoove-network\nnetworks:\n clumoove-network:\n driver: bridge\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "clumoove",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "frontend",
|
||||
"service_count": 5,
|
||||
"services": [
|
||||
{
|
||||
"name": "postgres-db",
|
||||
"image": "postgres:latest",
|
||||
"is_main": false,
|
||||
"role": "dependency",
|
||||
"vmid_offset": 1,
|
||||
"depends_on": [],
|
||||
"frontend_network": false,
|
||||
"private_network": true,
|
||||
"compose": {
|
||||
"image": "postgres:latest",
|
||||
"container_name": "clumoove-postgres",
|
||||
"restart": "unless-stopped",
|
||||
"command": [
|
||||
"postgres",
|
||||
"-c",
|
||||
"max_connections=300"
|
||||
],
|
||||
"environment": {
|
||||
"POSTGRES_USER": "clumoove",
|
||||
"POSTGRES_PASSWORD": "${GENERATED_POSTGRES_PASSWORD}",
|
||||
"POSTGRES_DB": "cloud_migration_db"
|
||||
},
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/clumoove/postgres",
|
||||
"target": "/var/lib/postgresql/data"
|
||||
}
|
||||
],
|
||||
"networks": [
|
||||
"clumoove-network"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "redis-queue",
|
||||
"image": "redis:latest",
|
||||
"is_main": false,
|
||||
"role": "dependency",
|
||||
"vmid_offset": 2,
|
||||
"depends_on": [],
|
||||
"frontend_network": false,
|
||||
"private_network": true,
|
||||
"compose": {
|
||||
"image": "redis:latest",
|
||||
"container_name": "clumoove-redis",
|
||||
"restart": "unless-stopped",
|
||||
"command": "redis-server --appendonly yes --requirepass \"clumoove_secure_redis_pass\" --bind 0.0.0.0",
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/clumoove/redis",
|
||||
"target": "/data"
|
||||
}
|
||||
],
|
||||
"networks": [
|
||||
"clumoove-network"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "api-backend",
|
||||
"image": "ghcr.io/xxroxxerxx/clumoove-api:latest",
|
||||
"is_main": false,
|
||||
"role": "dependency",
|
||||
"vmid_offset": 3,
|
||||
"depends_on": [
|
||||
"postgres-db",
|
||||
"redis-queue"
|
||||
],
|
||||
"frontend_network": false,
|
||||
"private_network": true,
|
||||
"compose": {
|
||||
"image": "ghcr.io/xxroxxerxx/clumoove-api:latest",
|
||||
"container_name": "clumoove-api",
|
||||
"restart": "unless-stopped",
|
||||
"environment": [
|
||||
"DATABASE_URL=postgres://clumoove:clumoove_secure_password_default@postgres-db:5432/cloud_migration_db?sslmode=disable",
|
||||
"REDIS_URL=redis://:clumoove_secure_redis_pass@redis-queue:6379",
|
||||
"PORT=8000",
|
||||
"ENCRYPTION_SECRET_KEY=${GENERATED_ENCRYPTION_SECRET_KEY}",
|
||||
"JWT_SECRET_KEY=${GENERATED_JWT_SECRET_KEY}",
|
||||
"TRUSTED_PROXY=1",
|
||||
"LOCAL_STORAGE_ROOT=/clumoove"
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/clumoove/storage",
|
||||
"target": "/clumoove"
|
||||
}
|
||||
],
|
||||
"depends_on": [
|
||||
"postgres-db",
|
||||
"redis-queue"
|
||||
],
|
||||
"networks": [
|
||||
"clumoove-network"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "migration-worker",
|
||||
"image": "ghcr.io/xxroxxerxx/clumoove-worker:latest",
|
||||
"is_main": false,
|
||||
"role": "dependency",
|
||||
"vmid_offset": 4,
|
||||
"depends_on": [
|
||||
"postgres-db",
|
||||
"redis-queue"
|
||||
],
|
||||
"frontend_network": false,
|
||||
"private_network": true,
|
||||
"compose": {
|
||||
"image": "ghcr.io/xxroxxerxx/clumoove-worker:latest",
|
||||
"container_name": "clumoove-worker",
|
||||
"restart": "unless-stopped",
|
||||
"command": [
|
||||
"/app/worker"
|
||||
],
|
||||
"environment": [
|
||||
"DATABASE_URL=postgres://clumoove:clumoove_secure_password_default@postgres-db:5432/cloud_migration_db?sslmode=disable",
|
||||
"REDIS_URL=redis://:clumoove_secure_redis_pass@redis-queue:6379",
|
||||
"ENCRYPTION_SECRET_KEY=${GENERATED_ENCRYPTION_SECRET_KEY}",
|
||||
"LOCAL_STORAGE_ROOT=/clumoove"
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/clumoove/storage",
|
||||
"target": "/clumoove"
|
||||
}
|
||||
],
|
||||
"depends_on": [
|
||||
"postgres-db",
|
||||
"redis-queue"
|
||||
],
|
||||
"networks": [
|
||||
"clumoove-network"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "frontend",
|
||||
"image": "ghcr.io/xxroxxerxx/clumoove-frontend:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [
|
||||
"api-backend"
|
||||
],
|
||||
"frontend_network": true,
|
||||
"private_network": true,
|
||||
"compose": {
|
||||
"image": "ghcr.io/xxroxxerxx/clumoove-frontend:latest",
|
||||
"container_name": "clumoove-frontend",
|
||||
"restart": "unless-stopped",
|
||||
"ports": [
|
||||
{
|
||||
"target": 3000,
|
||||
"published": "8380",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"environment": [
|
||||
"CLUMOOVE_API_URL="
|
||||
],
|
||||
"depends_on": [
|
||||
"api-backend"
|
||||
],
|
||||
"networks": [
|
||||
"clumoove-network"
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "clumoove",
|
||||
"networks": {
|
||||
"clumoove-network": {
|
||||
"driver": "bridge"
|
||||
}
|
||||
}
|
||||
},
|
||||
"networking": {
|
||||
"frontend": "selected-proxmox-bridge",
|
||||
"private_required": true,
|
||||
"private_creation": "automatic-create-if-missing",
|
||||
"private_address_allocation": "automatic-static-address-per-service",
|
||||
"service_discovery": "private-addresses-with-compose-service-host-aliases",
|
||||
"dependency_external_access": "disabled-unless-service-publishes-ports",
|
||||
"prompt_user_for_private_network": false
|
||||
},
|
||||
"storage": [
|
||||
{
|
||||
"id": "api-backend-volume-0",
|
||||
"service": "api-backend",
|
||||
"container_path": "/clumoove",
|
||||
"mode": "managed-volume",
|
||||
"user_selectable": false,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"source_path": null,
|
||||
"source_path_prompt": null
|
||||
},
|
||||
{
|
||||
"id": "migration-worker-volume-0",
|
||||
"service": "migration-worker",
|
||||
"container_path": "/clumoove",
|
||||
"mode": "managed-volume",
|
||||
"user_selectable": false,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"source_path": null,
|
||||
"source_path_prompt": null
|
||||
},
|
||||
{
|
||||
"id": "postgres-db-volume-0",
|
||||
"service": "postgres-db",
|
||||
"container_path": "/var/lib/postgresql/data",
|
||||
"mode": "managed-volume",
|
||||
"user_selectable": false,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"source_path": null,
|
||||
"source_path_prompt": null
|
||||
},
|
||||
{
|
||||
"id": "redis-queue-volume-0",
|
||||
"service": "redis-queue",
|
||||
"container_path": "/data",
|
||||
"mode": "host-bind",
|
||||
"user_selectable": true,
|
||||
"backup": false,
|
||||
"shared_with_other_lxc": true,
|
||||
"source_path": null,
|
||||
"source_path_prompt": "Host directory for redis-queue:/data"
|
||||
}
|
||||
],
|
||||
"orchestration": {
|
||||
"reserve_vmids_atomically": 5,
|
||||
"start_order": [
|
||||
"postgres-db",
|
||||
"redis-queue",
|
||||
"api-backend",
|
||||
"migration-worker",
|
||||
"frontend"
|
||||
],
|
||||
"stop_order": [
|
||||
"frontend",
|
||||
"migration-worker",
|
||||
"api-backend",
|
||||
"redis-queue",
|
||||
"postgres-db"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": [
|
||||
{
|
||||
"id": "encryption-secret-key",
|
||||
"strategy": "generate-cryptographically-random-at-install",
|
||||
"bindings": [
|
||||
{
|
||||
"service": "api-backend",
|
||||
"environment_variable": "ENCRYPTION_SECRET_KEY"
|
||||
},
|
||||
{
|
||||
"service": "migration-worker",
|
||||
"environment_variable": "ENCRYPTION_SECRET_KEY"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "jwt-secret-key",
|
||||
"strategy": "generate-cryptographically-random-at-install",
|
||||
"bindings": [
|
||||
{
|
||||
"service": "api-backend",
|
||||
"environment_variable": "JWT_SECRET_KEY"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "postgres-password",
|
||||
"strategy": "generate-cryptographically-random-at-install",
|
||||
"bindings": [
|
||||
{
|
||||
"service": "postgres-db",
|
||||
"environment_variable": "POSTGRES_PASSWORD"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 3000,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"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"
|
||||
}
|
||||
],
|
||||
"generic_stack_review": [
|
||||
"api-backend: perfil de salud y persistencia pendiente",
|
||||
"migration-worker: perfil de salud y persistencia pendiente",
|
||||
"postgres-db: comando de dependencia personalizado pendiente",
|
||||
"redis-queue: comando de dependencia personalizado pendiente",
|
||||
"volumen compartido entre servicios pendiente"
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": false,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"cap_add",
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"sysctls",
|
||||
"tty",
|
||||
"user",
|
||||
"volumes",
|
||||
"working_dir"
|
||||
],
|
||||
"untranslated_blockers": [
|
||||
"multi-service-compose",
|
||||
"compose-key:depends_on",
|
||||
"service:api-backend:compose-key:depends_on",
|
||||
"service:migration-worker:compose-key:depends_on",
|
||||
"native-multi-lxc-orchestrator-not-yet-implemented"
|
||||
],
|
||||
"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,290 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-code-server",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Code Server"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Code-server is VS Code running on a remote server, accessible through the browser."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Code-server is VS Code running on a remote server, accessible through the browser."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/code-server-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/code-server-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 8443,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://coder.com",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-code-server/",
|
||||
"repository": "https://github.com/linuxserver/docker-code-server",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-05-17",
|
||||
"note": "Let server listen on both ipv4 and ipv6 even when running container as root."
|
||||
},
|
||||
{
|
||||
"date": "2025-08-10",
|
||||
"note": "Let server listen on both ipv4 and ipv6."
|
||||
},
|
||||
{
|
||||
"date": "2025-06-03",
|
||||
"note": "Allow setting PWA name using env var `PWA_APPNAME`."
|
||||
},
|
||||
{
|
||||
"date": "2024-10-13",
|
||||
"note": "Only chown config folder when change to ownership or new install is detected."
|
||||
},
|
||||
{
|
||||
"date": "2024-10-09",
|
||||
"note": "Manage permissions in /config/.ssh according to file type"
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-05-17"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-code-server",
|
||||
"default_branch": "master",
|
||||
"revision": "efc786252e7750b6e9915bc57aff86454d88b0f4",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-code-server/efc786252e7750b6e9915bc57aff86454d88b0f4/README.md",
|
||||
"readme_pushed_at": "2026-09-11T05:22:23Z",
|
||||
"compose_sha256": "07da8874c9c570566a876e5fba9b523cee9ca8ee54ac950381d7db9b3720bc70",
|
||||
"generated_at": "2026-09-12T14:37:25+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "code-server",
|
||||
"container_name": "code-server",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/code-server:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/code-server",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PASSWORD",
|
||||
"example": "password",
|
||||
"required": false,
|
||||
"sensitive": true,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "HASHED_PASSWORD",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": true,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "SUDO_PASSWORD",
|
||||
"example": "password",
|
||||
"required": false,
|
||||
"sensitive": true,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "SUDO_PASSWORD_HASH",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": true,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PROXY_DOMAIN",
|
||||
"example": "code-server.my.domain",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "DEFAULT_WORKSPACE",
|
||||
"example": "/config/workspace",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PWA_APPNAME",
|
||||
"example": "code-server",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/code-server/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": 8443,
|
||||
"published_example": 8443,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n code-server:\n image: lscr.io/linuxserver/code-server:latest\n container_name: code-server\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n - PASSWORD=password #optional\n - HASHED_PASSWORD= #optional\n - SUDO_PASSWORD=password #optional\n - SUDO_PASSWORD_HASH= #optional\n - PROXY_DOMAIN=code-server.my.domain #optional\n - DEFAULT_WORKSPACE=/config/workspace #optional\n - PWA_APPNAME=code-server #optional\n volumes:\n - /path/to/code-server/config:/config\n ports:\n - 8443:8443\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 8443,
|
||||
"path": "/",
|
||||
"source": "compose-first-tcp-port-fallback"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,417 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-codeproject-ai",
|
||||
"status": "laboratory-validated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "CodeProject.AI Server"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "CodeProject.AI Server"
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Official latest CPU image with persistent settings and modules. Initial CPU and Coral PCIe inference passed on Intel amd64. Coral module uses its persistent upstream EdgeTPU runtime via module-scoped LD_PRELOAD; missing JSON defaults preserve existing user settings. The TPU needs exclusive access. ARM and NVIDIA channels are not offered by this template; Failures observed on the AMD lab host remain unexplained; no blanket AMD incompatibility is inferred."
|
||||
},
|
||||
"category": "ai",
|
||||
"category_label": "AI",
|
||||
"author": "codeproject",
|
||||
"developer": "codeproject",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 32168,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://github.com/codeproject/CodeProject.AI-Server",
|
||||
"documentation": "https://github.com/codeproject/CodeProject.AI-Server",
|
||||
"repository": "https://github.com/codeproject/CodeProject.AI-Server",
|
||||
"tips": [
|
||||
"Official latest CPU image with persistent settings and modules. Initial CPU and Coral PCIe inference passed on Intel amd64. Coral module uses its persistent upstream EdgeTPU runtime via module-scoped LD_PRELOAD; missing JSON defaults preserve existing user settings. The TPU needs exclusive access. ARM and NVIDIA channels are not offered by this template; Failures observed on the AMD lab host remain unexplained; no blanket AMD incompatibility is inferred.",
|
||||
"Install ObjectDetectionCoral in the dashboard. Stop competing object detectors when assigning its detection route; exposing a device does not configure an inference module."
|
||||
],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-09-16",
|
||||
"hidden": true,
|
||||
"hidden_reason": "Temporarily withdrawn at user request pending further hardware validation."
|
||||
},
|
||||
"source": {
|
||||
"provider": "codeproject",
|
||||
"repository": "https://github.com/codeproject/CodeProject.AI-Server",
|
||||
"default_branch": "main",
|
||||
"revision": "e3468c831b169e27ed6c97f665f1efb48ab0285f",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/codeproject/CodeProject.AI-Server/e3468c831b169e27ed6c97f665f1efb48ab0285f/README.md",
|
||||
"image_repository_url": "https://hub.docker.com/r/codeproject/ai-server",
|
||||
"compose_sha256": "a8ce9bcbde2cbc0fc9a840b93bab72a33da2a2f4a18857896b837cbc7f462ece",
|
||||
"generated_at": "2026-09-16T22:00:00+02:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "codeproject-ai",
|
||||
"container_name": "codeproject-ai",
|
||||
"image": {
|
||||
"reference": "codeproject/ai-server:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "codeproject/ai-server",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "config",
|
||||
"container_path": "/etc/codeproject/ai",
|
||||
"compose_source_example": "config-data",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 4
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "modules",
|
||||
"container_path": "/app/modules",
|
||||
"compose_source_example": "modules-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": 32168,
|
||||
"published_example": 32168,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "{\n \"services\": {\n \"codeproject-ai\": {\n \"image\": \"codeproject/ai-server:latest\",\n \"volumes\": [\n \"config-data:/etc/codeproject/ai\",\n \"modules-data:/app/modules\"\n ],\n \"ports\": [\n \"32168:32168\"\n ],\n \"environment\": {},\n \"restart\": \"unless-stopped\"\n }\n }\n}"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "mkvtoolnix",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "mkvtoolnix",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "mkvtoolnix",
|
||||
"image": "jlesage/mkvtoolnix:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"image": "jlesage/mkvtoolnix:latest",
|
||||
"ports": [
|
||||
"5800:5800"
|
||||
],
|
||||
"environment": {
|
||||
"USER_ID": "1000",
|
||||
"GROUP_ID": "1000",
|
||||
"TZ": "Europe/Madrid"
|
||||
},
|
||||
"volumes": [
|
||||
"mkvtoolnix-config:/config",
|
||||
"/mnt/oci-shared/media:/storage"
|
||||
],
|
||||
"restart": "unless-stopped"
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {},
|
||||
"networking": {
|
||||
"frontend": "selected-proxmox-bridge",
|
||||
"private_required": false,
|
||||
"private_creation": "not-required",
|
||||
"private_address_allocation": "not-required",
|
||||
"service_discovery": "dedicated-lxc-address",
|
||||
"dependency_external_access": "not-applicable",
|
||||
"prompt_user_for_private_network": false
|
||||
},
|
||||
"storage": [
|
||||
{
|
||||
"id": "mkvtoolnix-config",
|
||||
"service": "mkvtoolnix",
|
||||
"container_path": "/config",
|
||||
"mode": "user-selectable",
|
||||
"user_selectable": true,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"default": "managed-volume",
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "mkvtoolnix-storage",
|
||||
"service": "mkvtoolnix",
|
||||
"container_path": "/storage",
|
||||
"mode": "user-selectable",
|
||||
"user_selectable": true,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": true,
|
||||
"default": "host-bind",
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
]
|
||||
}
|
||||
],
|
||||
"orchestration": {
|
||||
"reserve_vmids_atomically": 1,
|
||||
"start_order": [
|
||||
"mkvtoolnix"
|
||||
],
|
||||
"stop_order": [
|
||||
"mkvtoolnix"
|
||||
],
|
||||
"dependency_readiness": "mandatory-http-first-start-healthcheck",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-external-host-data"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"image_digest_resolution",
|
||||
"managed_volume_preparation"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"proxmox": {
|
||||
"runtime": "native-oci-lxc",
|
||||
"technology_status": "proxmox-technology-preview",
|
||||
"catalog": {
|
||||
"replaces_discovered_ids": []
|
||||
},
|
||||
"defaults": {
|
||||
"unprivileged": true,
|
||||
"ostype": "auto-from-image",
|
||||
"cores": 2,
|
||||
"memory_mb": 2048,
|
||||
"swap_mb": 512,
|
||||
"rootfs_size_gb": 8,
|
||||
"rootfs_storage": "local-lvm",
|
||||
"volume_storage": "local-lvm",
|
||||
"template_storage": "local",
|
||||
"bridge": "vmbr0",
|
||||
"ipv4": "dhcp",
|
||||
"firewall": true,
|
||||
"host_managed_network": true,
|
||||
"onboot": false,
|
||||
"features": [
|
||||
"nesting=1"
|
||||
],
|
||||
"shutdown_timeout_seconds": 30
|
||||
},
|
||||
"image_metadata_policy": {
|
||||
"entrypoint": "import-from-oci-image",
|
||||
"cmd": "import-from-oci-image",
|
||||
"environment": "import-image-env-then-apply-compose-overrides",
|
||||
"user": "import-from-oci-image",
|
||||
"working_dir": "import-from-oci-image",
|
||||
"stop_signal": "import-from-oci-image"
|
||||
},
|
||||
"adaptations": [
|
||||
{
|
||||
"id": "native-persistent-volumes",
|
||||
"upstream_behavior": "Docker bind mounts persistent directories into the image.",
|
||||
"native_lxc_behavior": "ProxMenux attaches native Proxmox volumes or explicit host bind mounts at the same container paths.",
|
||||
"reason": "Preserve the official image contract while making persistence visible to Proxmox backup policy.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "passed-amd64-intel"
|
||||
},
|
||||
{
|
||||
"id": "native-device-passthrough",
|
||||
"upstream_behavior": "Docker exposes explicitly selected host devices to the container.",
|
||||
"native_lxc_behavior": "ProxMenux maps each selected device with the native Proxmox dev resource.",
|
||||
"reason": "The OCI process runs directly inside an LXC rather than through Docker.",
|
||||
"behavioral_impact": "Only devices explicitly selected by the user are exposed.",
|
||||
"validation": "not-required"
|
||||
},
|
||||
{
|
||||
"id": "persistent-coral-module-runtime",
|
||||
"upstream_behavior": "The official Coral module downloads the EdgeTPU runtime into its module folder, then copies a library into /usr/lib.",
|
||||
"native_lxc_behavior": "Module-scoped LD_PRELOAD points to the same upstream runtime retained in /app/modules. Missing defaults are merged into the official /etc/codeproject/ai/modulesettings.json.",
|
||||
"reason": "A new image rootfs does not retain libraries installed after image creation, in Docker or native OCI.",
|
||||
"behavioral_impact": "Only ObjectDetectionCoral receives this setting; existing user overrides are preserved. No image files or host drivers are changed.",
|
||||
"validation": "passed-installer-recreation-and-coral-inference-amd64-intel"
|
||||
}
|
||||
],
|
||||
"installer_profile": {
|
||||
"optional_devices": [
|
||||
{
|
||||
"id": "coral-pcie",
|
||||
"kind": "character-device",
|
||||
"enable_prompt": "Add a Coral PCIe/M.2 device?",
|
||||
"enabled_default": false,
|
||||
"path_prompt": "Coral PCIe/M.2 node (e.g. /dev/apex_0)",
|
||||
"host_path_default": "/dev/apex_0",
|
||||
"container_path_strategy": "same-as-host",
|
||||
"mode": "0660",
|
||||
"deny_write": false,
|
||||
"gid_strategy": "host-device-gid"
|
||||
}
|
||||
],
|
||||
"startup_healthcheck": {
|
||||
"scheme": "http",
|
||||
"port": 32168,
|
||||
"path": "/",
|
||||
"timeout_seconds": 300,
|
||||
"request_timeout_seconds": 10,
|
||||
"stability_seconds": 4,
|
||||
"verify_tls": false
|
||||
},
|
||||
"generated_files": [
|
||||
{
|
||||
"container_path": "/etc/codeproject/ai/modulesettings.json",
|
||||
"mode": "0644",
|
||||
"owner": "mapped-root",
|
||||
"only_if_missing": true,
|
||||
"json_defaults": true,
|
||||
"content": "{\n \"Modules\": {\n \"ObjectDetectionCoral\": {\n \"EnvironmentVariables\": {\n \"LD_PRELOAD\": \"/app/modules/ObjectDetectionCoral/edgetpu_runtime/libedgetpu/throttled/k8/libedgetpu.so.1.0\"\n },\n \"LaunchSettings\": {\n \"AutoStart\": false\n }\n }\n }\n}\n"
|
||||
}
|
||||
],
|
||||
"hardware_acceleration": {
|
||||
"prompt": "Acceleration for CodeProject.AI",
|
||||
"default": "cpu",
|
||||
"profiles": [
|
||||
{
|
||||
"id": "cpu",
|
||||
"label": "CPU",
|
||||
"device_requests": [],
|
||||
"image": {
|
||||
"reference": "codeproject/ai-server:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "codeproject/ai-server",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "nvidia",
|
||||
"label": "NVIDIA (CUDA; official GPU image)",
|
||||
"image": {
|
||||
"reference": "codeproject/ai-server:gpu",
|
||||
"registry": "docker.io",
|
||||
"repository": "codeproject/ai-server",
|
||||
"tag": "gpu",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"device_requests": [
|
||||
{
|
||||
"id": "nvidia-runtime",
|
||||
"kind": "nvidia-runtime",
|
||||
"purpose": "nvidia-cuda",
|
||||
"device_selection": "all-requested-by-compose"
|
||||
}
|
||||
],
|
||||
"environment": [
|
||||
{
|
||||
"name": "NVIDIA_VISIBLE_DEVICES",
|
||||
"value": "all"
|
||||
},
|
||||
{
|
||||
"name": "NVIDIA_DRIVER_CAPABILITIES",
|
||||
"value": "compute,utility"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"security_profile": {
|
||||
"requires_privileged_lxc": false,
|
||||
"source_requests_privileged_lxc": false,
|
||||
"optional_privileged_lxc": false,
|
||||
"requires_host_pid_namespace": false,
|
||||
"source_requests_relaxed_confinement": false,
|
||||
"requires_relaxed_confinement": false,
|
||||
"optional_relaxed_confinement": false,
|
||||
"risk_level": "normal",
|
||||
"confirmation_required": false,
|
||||
"warning": "No security relaxation is required for the reviewed profile."
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": true,
|
||||
"supported_compose_keys": [
|
||||
"devices",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "Official latest CPU image with persistent settings and modules. Initial CPU and Coral PCIe inference passed on Intel amd64. Coral module uses its persistent upstream EdgeTPU runtime via module-scoped LD_PRELOAD; missing JSON defaults preserve existing user settings. The TPU needs exclusive access. ARM and NVIDIA channels are not offered by this template; Failures observed on the AMD lab host remain unexplained; no blanket AMD incompatibility is inferred. NVIDIA uses the official gpu channel with native Toolkit integration; inference validation pending. Intel/AMD GPU inference is not advertised without an upstream compatible module/runtime."
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 32168,
|
||||
"path": "/",
|
||||
"source": "https://github.com/codeproject/CodeProject.AI-Server"
|
||||
}
|
||||
],
|
||||
"credentials": []
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "passed-amd64-intel",
|
||||
"service_health": "passed-amd64-intel",
|
||||
"restart_persistence": "passed-amd64-intel",
|
||||
"backup_restore": "passed-interrupted-candidate-native-recovery",
|
||||
"update_preserves_data": "passed-same-digest-rootfs-recreation",
|
||||
"evidence": "docs/lab/new-images-validation-20260918.json"
|
||||
},
|
||||
"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-readme-revision-and-resolved-latest-image-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,427 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-convertx",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "ConvertX"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "A versatile file conversion tool that supports multiple formats."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "ConvertX is a self-hosted file conversion service that allows users to convert files between different formats through an intuitive web interface. It supports a wide range of file types including documents, images, videos, and audio files, making it a comprehensive solution for all your file conversion needs.\n\nThe service is designed with simplicity and ease of use in mind. Users can simply upload their files, select the desired output format, and let ConvertX handle the conversion process. The web interface provides a clean and user-friendly experience, with drag-and-drop support and batch conversion capabilities.\n\nConvertX runs entirely on your own infrastructure, ensuring that your files remain private and secure. There's no need to upload sensitive documents to third-party services, giving you full control over your data. The service is containerized for easy deployment and can be integrated into existing home server setups.\n\n**Key Features:**\n- Support for multiple file formats (documents, images, videos, audio)\n- Intuitive web interface with drag-and-drop support\n- Batch conversion capabilities\n- Self-hosted for privacy and security\n- Containerized for easy deployment\n- No file size limitations\n\n**Learn More:**\n- [ConvertX GitHub Repository](https://github.com/c4illin/convertx)\n"
|
||||
},
|
||||
"category": "documents",
|
||||
"category_label": "Documents & Notes",
|
||||
"author": "c4illin",
|
||||
"developer": "c4illin",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 3000,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "",
|
||||
"documentation": null,
|
||||
"repository": "https://hub.docker.com/r/c4illin/convertx",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "c4illin",
|
||||
"repository": "https://hub.docker.com/r/c4illin/convertx",
|
||||
"revision": "20d9f7eb1e084a5dd716a04c49f64bf3e291565b462f17ebfa942e1898fbba91",
|
||||
"image_repository_url": "https://hub.docker.com/r/c4illin/convertx",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "20d9f7eb1e084a5dd716a04c49f64bf3e291565b462f17ebfa942e1898fbba91",
|
||||
"generated_at": "2026-09-13T15:34:58+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "convertx",
|
||||
"container_name": "convertx",
|
||||
"image": {
|
||||
"reference": "c4illin/convertx:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "c4illin/convertx",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "JWT_SECRET",
|
||||
"example": "${GENERATED_JWT_SECRET}",
|
||||
"required": true,
|
||||
"sensitive": true,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "HTTP_ALLOWED",
|
||||
"example": "true",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/app/data",
|
||||
"compose_source_example": "/DATA/AppData/$AppID/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": 3000,
|
||||
"published_example": 3333,
|
||||
"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: convertx\nservices:\n convertx:\n image: c4illin/convertx:latest\n container_name: convertx\n restart: unless-stopped\n deploy:\n resources:\n reservations:\n memory: 500M\n ports:\n - 3333:3000\n environment:\n - JWT_SECRET=${GENERATED_JWT_SECRET}\n - HTTP_ALLOWED=true\n volumes:\n - type: bind\n source: /DATA/AppData/$AppID/data\n target: /app/data\n network_mode: bridge\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "convertx",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "convertx",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "convertx",
|
||||
"image": "c4illin/convertx:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"image": "c4illin/convertx:latest",
|
||||
"container_name": "convertx",
|
||||
"restart": "unless-stopped",
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "500M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"ports": [
|
||||
"3333:3000"
|
||||
],
|
||||
"environment": [
|
||||
"JWT_SECRET=${GENERATED_JWT_SECRET}",
|
||||
"HTTP_ALLOWED=true"
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/data",
|
||||
"target": "/app/data"
|
||||
}
|
||||
],
|
||||
"network_mode": "bridge"
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "convertx"
|
||||
},
|
||||
"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": "convertx-volume-0",
|
||||
"service": "convertx",
|
||||
"container_path": "/app/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": [
|
||||
"convertx"
|
||||
],
|
||||
"stop_order": [
|
||||
"convertx"
|
||||
],
|
||||
"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": "jwt-secret",
|
||||
"strategy": "generate-cryptographically-random-at-install",
|
||||
"bindings": [
|
||||
{
|
||||
"service": "convertx",
|
||||
"environment_variable": "JWT_SECRET"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 3000,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"credentials": []
|
||||
},
|
||||
"proxmox": {
|
||||
"runtime": "native-oci-lxc",
|
||||
"technology_status": "proxmox-technology-preview",
|
||||
"defaults": {
|
||||
"unprivileged": true,
|
||||
"ostype": "auto-from-image",
|
||||
"cores": 2,
|
||||
"memory_mb": 500,
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"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,264 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-cops",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Cops"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Cops by S\u00e9bastien Lucas, now maintained by MikesPub, stands for Calibre OPDS (and HTML) Php Server."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Cops by S\u00e9bastien Lucas, now maintained by MikesPub, stands for Calibre OPDS (and HTML) Php Server."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/cops-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/cops-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 80,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://github.com/mikespub-org/seblucas-cops",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-cops/",
|
||||
"repository": "https://github.com/linuxserver/docker-cops",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-07-21",
|
||||
"note": "Rebase to Alpine 3.24."
|
||||
},
|
||||
{
|
||||
"date": "2026-06-10",
|
||||
"note": "Existing users should verify: site-confs/default.conf and config/local.php - Update redirect location and use front controller."
|
||||
},
|
||||
{
|
||||
"date": "2026-02-08",
|
||||
"note": "Existing users should update: site-confs/default.conf - Deny access to all dotfiles."
|
||||
},
|
||||
{
|
||||
"date": "2026-02-08",
|
||||
"note": "Adding missing php-tokenizer package."
|
||||
},
|
||||
{
|
||||
"date": "2025-10-10",
|
||||
"note": "Adding missing icu-data-full package."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-07-21"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-cops",
|
||||
"default_branch": "master",
|
||||
"revision": "ff91cb28a95537f8dff796fbf013cf7059362e5c",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-cops/ff91cb28a95537f8dff796fbf013cf7059362e5c/README.md",
|
||||
"readme_pushed_at": "2026-09-06T22:40:35Z",
|
||||
"compose_sha256": "181b0f5516fb29ec1ae08d284975f4fd5847c0bcdb9492fb8e0e466caf57381c",
|
||||
"generated_at": "2026-09-12T14:37:25+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "cops",
|
||||
"container_name": "cops",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/cops:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/cops",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/cops/config",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 4
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-1",
|
||||
"container_path": "/books",
|
||||
"compose_source_example": "/path/to/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"
|
||||
},
|
||||
{
|
||||
"container_port": 443,
|
||||
"published_example": 443,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n cops:\n image: lscr.io/linuxserver/cops:latest\n container_name: cops\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/cops/config:/config\n - /path/to/data:/books\n ports:\n - 80:80\n - 443:443\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 80,
|
||||
"path": "/",
|
||||
"source": "compose-first-tcp-port-fallback"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,434 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-copyparty",
|
||||
"status": "laboratory-validated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "CopyParty"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "A simple, private file server."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "**CopyParty** is a fast, privacy-focused file sharing server using a local-first, single-file architecture, ensuring full control over data without cloud dependencies. Its intuitive interface supports offline use, with cross-platform compatibility and multi-protocol access, delivering a secure, efficient file management experience, ideal for users seeking direct data ownership and a lightweight solution.\n\nThe app's core features include accelerated resumable uploads (via the up2k protocol), ensuring reliable large file transfers, and automatic deduplication to optimize storage. It helps users organize folders and media effortlessly, with a web-based file manager that includes a built-in media indexer and thumbnail generator for quick previews. Fine-grained permission controls allow specific user access rules. The \"upload-while-downloading\" feature enhances sharing efficiency, and the zero-dependency design ensures it runs on almost any hardware.\n\nIt integrates multiple access protocols, including HTTP, WebDAV, FTP, and TFTP, supporting connections from standard web browsers, dedicated file clients, and legacy hardware (such as PSP). The app supports Docker and Python for deployment, simplifying setup across various server environments. It facilitates seamless access to local files without complex configuration. Community documentation enhances usability, and the app's simple operation and high flexibility deliver a modern local file service solution.\n\n**Key Features:**\n- Privacy-focused local file sharing\n- Zero-dependency single-file architecture\n- Accelerated resumable uploads\n- Multi-protocol support (HTTP, WebDAV, FTP, etc.)\n- Cross-platform compatibility\n- Media indexing and streaming\n- Smart deduplication\n- User permission management\n\n**Learn More:**\n- [CopyParty GitHub Repository](https://github.com/9001/copyparty)\n"
|
||||
},
|
||||
"category": "downloads",
|
||||
"category_label": "Files & Downloads",
|
||||
"author": "CopyParty",
|
||||
"developer": "CopyParty",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 3923,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://copyparty.eu/",
|
||||
"documentation": null,
|
||||
"repository": "https://hub.docker.com/r/icewhaletech/copyparty",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "icewhaletech",
|
||||
"repository": "https://hub.docker.com/r/icewhaletech/copyparty",
|
||||
"revision": "5c36ae07cfde54cc3929da3fec0c4632270d7f2b93a0754260802379c0e62ff5",
|
||||
"image_repository_url": "https://hub.docker.com/r/icewhaletech/copyparty",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "5c36ae07cfde54cc3929da3fec0c4632270d7f2b93a0754260802379c0e62ff5",
|
||||
"generated_at": "2026-09-13T15:34:58+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "copyparty",
|
||||
"container_name": "copyparty",
|
||||
"image": {
|
||||
"reference": "icewhaletech/copyparty:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "icewhaletech/copyparty",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/w",
|
||||
"compose_source_example": "/DATA/AppData/$AppID/w",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-1",
|
||||
"container_path": "/cfg",
|
||||
"compose_source_example": "/DATA/AppData/$AppID/confg",
|
||||
"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": 3923,
|
||||
"published_example": 29708,
|
||||
"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: copyparty\nservices:\n copyparty:\n image: icewhaletech/copyparty:latest\n container_name: copyparty\n ports:\n - target: 3923\n published: '29708'\n protocol: tcp\n network_mode: bridge\n volumes:\n - type: bind\n source: /DATA/AppData/$AppID/w\n target: /w\n - type: bind\n source: /DATA/AppData/$AppID/confg\n target: /cfg\n deploy:\n resources:\n reservations:\n memory: 512m\n stdin_open: true\n tty: true\n restart: unless-stopped\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "copyparty",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "copyparty",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "copyparty",
|
||||
"image": "icewhaletech/copyparty:1.20.13",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"image": "icewhaletech/copyparty:1.20.13",
|
||||
"container_name": "copyparty",
|
||||
"ports": [
|
||||
{
|
||||
"target": 3923,
|
||||
"published": "29708",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"network_mode": "bridge",
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/w",
|
||||
"target": "/w"
|
||||
},
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/confg",
|
||||
"target": "/cfg"
|
||||
}
|
||||
],
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "512m"
|
||||
}
|
||||
}
|
||||
},
|
||||
"stdin_open": true,
|
||||
"tty": true,
|
||||
"restart": "unless-stopped"
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "copyparty"
|
||||
},
|
||||
"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": "copyparty-volume-0",
|
||||
"service": "copyparty",
|
||||
"container_path": "/w",
|
||||
"mode": "managed-volume",
|
||||
"user_selectable": false,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"source_path": null,
|
||||
"source_path_prompt": null
|
||||
},
|
||||
{
|
||||
"id": "copyparty-volume-1",
|
||||
"service": "copyparty",
|
||||
"container_path": "/cfg",
|
||||
"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": [
|
||||
"copyparty"
|
||||
],
|
||||
"stop_order": [
|
||||
"copyparty"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 3923,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"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": 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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"behavioral_impact": "A privileged LXC has weaker isolation from the Proxmox host.",
|
||||
"validation": "native-equivalent"
|
||||
},
|
||||
{
|
||||
"id": "compose-process-runtime",
|
||||
"upstream_behavior": "Compose can replace Entrypoint, User and WorkingDir and request an init process or interactive terminal.",
|
||||
"native_lxc_behavior": "ProxMenux applies the process overrides through native LXC init directives; lxc-init provides PID 1 supervision and the CT console provides terminal access.",
|
||||
"reason": "The OCI process must start with the same identity, command and working directory without Docker.",
|
||||
"behavioral_impact": "Compose stdin_open and tty become access through the Proxmox LXC console.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-healthcheck",
|
||||
"upstream_behavior": "Docker periodically executes the declared container healthcheck.",
|
||||
"native_lxc_behavior": "For a single-service LXC, ProxMenux translates HTTP localhost checks into a mandatory first-start service check.",
|
||||
"reason": "Proxmox has no persistent Docker health state, while the installer still must detect a failed first boot.",
|
||||
"behavioral_impact": "The check runs during installation rather than continuously after installation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-cpu-priority",
|
||||
"upstream_behavior": "Docker cpu_shares sets a relative scheduling weight with 1024 as its neutral value.",
|
||||
"native_lxc_behavior": "ProxMenux converts the relative weight to Proxmox cpuunits with 100 as its neutral value and lets the user review it.",
|
||||
"reason": "Both settings express relative CPU priority on different scales.",
|
||||
"behavioral_impact": "Rounding and Proxmox minimum limits can slightly change very low weights.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-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": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"user",
|
||||
"volumes",
|
||||
"working_dir"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "Single-image definitions are installable when every declared Compose option has a native Proxmox translation. Multi-image and unsupported runtime features remain blocked until their orchestrator or mapping is available."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "passed-amd64",
|
||||
"service_health": "passed-amd64",
|
||||
"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,535 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-crafty",
|
||||
"status": "laboratory-validated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Crafty"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Take control of your Minecraft servers."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Crafty is an open source Minecraft control panel built using Tornado and AdminLTE, featuring server scheduling, a interactive console and the ability to run almost any type of Minecraft server"
|
||||
},
|
||||
"category": "media",
|
||||
"category_label": "Media & Streaming",
|
||||
"author": "Crafty Team",
|
||||
"developer": "Crafty Team",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 8443,
|
||||
"path": "/panel"
|
||||
},
|
||||
"website": "https://craftycontrol.com",
|
||||
"documentation": null,
|
||||
"repository": "https://registry.gitlab.com/crafty-controller/crafty-4",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "official",
|
||||
"repository": "https://registry.gitlab.com/crafty-controller/crafty-4",
|
||||
"revision": "dcb128be69705dae3d29ae21c558c74a4f583737259a8b0e8b6e22c1846b1547",
|
||||
"image_repository_url": "https://registry.gitlab.com/crafty-controller/crafty-4",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "dcb128be69705dae3d29ae21c558c74a4f583737259a8b0e8b6e22c1846b1547",
|
||||
"generated_at": "2026-09-13T15:34:58+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "crafty",
|
||||
"container_name": "crafty-container",
|
||||
"image": {
|
||||
"reference": "registry.gitlab.com/crafty-controller/crafty-4:latest",
|
||||
"registry": "registry.gitlab.com",
|
||||
"repository": "registry.gitlab.com/crafty-controller/crafty-4",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/crafty/backups",
|
||||
"compose_source_example": "/DATA/AppData/crafty/backups",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-1",
|
||||
"container_path": "/crafty/logs",
|
||||
"compose_source_example": "/DATA/AppData/crafty/logs",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-2",
|
||||
"container_path": "/crafty/servers",
|
||||
"compose_source_example": "/DATA/AppData/crafty/servers",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-3",
|
||||
"container_path": "/crafty/app/config",
|
||||
"compose_source_example": "/DATA/AppData/crafty/config",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-4",
|
||||
"container_path": "/crafty/import",
|
||||
"compose_source_example": "/DATA/AppData/crafty/import",
|
||||
"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": 8443,
|
||||
"published_example": 8111,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 8123,
|
||||
"published_example": 8112,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 19132,
|
||||
"published_example": 19132,
|
||||
"protocol": "udp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 25500,
|
||||
"published_example": 25500,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat",
|
||||
"container_port_end": 25600,
|
||||
"published_example_end": 25600
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "always",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "name: crafty\nversion: '3'\nservices:\n crafty:\n container_name: crafty-container\n image: registry.gitlab.com/crafty-controller/crafty-4:latest\n restart: always\n environment:\n - TZ=Etc/UTC\n ports:\n - 8111:8443\n - 8112:8123\n - 19132:19132/udp\n - 25500-25600:25500-25600\n volumes:\n - /DATA/AppData/crafty/backups:/crafty/backups\n - /DATA/AppData/crafty/logs:/crafty/logs\n - /DATA/AppData/crafty/servers:/crafty/servers\n - /DATA/AppData/crafty/config:/crafty/app/config\n - /DATA/AppData/crafty/import:/crafty/import\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "crafty",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "crafty",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "crafty",
|
||||
"image": "registry.gitlab.com/crafty-controller/crafty-4:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"container_name": "crafty-container",
|
||||
"image": "registry.gitlab.com/crafty-controller/crafty-4:latest",
|
||||
"restart": "always",
|
||||
"environment": [
|
||||
"TZ=Etc/UTC"
|
||||
],
|
||||
"ports": [
|
||||
"8111:8443",
|
||||
"8112:8123",
|
||||
"19132:19132/udp",
|
||||
"25500-25600:25500-25600"
|
||||
],
|
||||
"volumes": [
|
||||
"/DATA/AppData/crafty/backups:/crafty/backups",
|
||||
"/DATA/AppData/crafty/logs:/crafty/logs",
|
||||
"/DATA/AppData/crafty/servers:/crafty/servers",
|
||||
"/DATA/AppData/crafty/config:/crafty/app/config",
|
||||
"/DATA/AppData/crafty/import:/crafty/import"
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "crafty",
|
||||
"version": "3"
|
||||
},
|
||||
"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": "crafty-volume-0",
|
||||
"service": "crafty",
|
||||
"container_path": "/crafty/backups",
|
||||
"mode": "managed-volume",
|
||||
"user_selectable": false,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"source_path": null,
|
||||
"source_path_prompt": null
|
||||
},
|
||||
{
|
||||
"id": "crafty-volume-1",
|
||||
"service": "crafty",
|
||||
"container_path": "/crafty/logs",
|
||||
"mode": "managed-volume",
|
||||
"user_selectable": false,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"source_path": null,
|
||||
"source_path_prompt": null
|
||||
},
|
||||
{
|
||||
"id": "crafty-volume-2",
|
||||
"service": "crafty",
|
||||
"container_path": "/crafty/servers",
|
||||
"mode": "managed-volume",
|
||||
"user_selectable": false,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"source_path": null,
|
||||
"source_path_prompt": null
|
||||
},
|
||||
{
|
||||
"id": "crafty-volume-3",
|
||||
"service": "crafty",
|
||||
"container_path": "/crafty/app/config",
|
||||
"mode": "managed-volume",
|
||||
"user_selectable": false,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"source_path": null,
|
||||
"source_path_prompt": null
|
||||
},
|
||||
{
|
||||
"id": "crafty-volume-4",
|
||||
"service": "crafty",
|
||||
"container_path": "/crafty/import",
|
||||
"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": [
|
||||
"crafty"
|
||||
],
|
||||
"stop_order": [
|
||||
"crafty"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 8443,
|
||||
"path": "/panel",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"user",
|
||||
"volumes",
|
||||
"working_dir"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "Single-image definitions are installable when every declared Compose option has a native Proxmox translation. Multi-image and unsupported runtime features remain blocked until their orchestrator or mapping is available."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "passed-amd64",
|
||||
"service_health": "passed-amd64",
|
||||
"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,372 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-cura",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Cura"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "UltiMaker Cura is free, easy-to-use 3D printing software trusted by millions of users. Fine-tune your 3D model with 400+ settings for the best slicing and printing results."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "UltiMaker Cura is free, easy-to-use 3D printing software trusted by millions of users. Fine-tune your 3D model with 400+ settings for the best slicing and printing results."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/cura-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/cura-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://ultimaker.com/software/ultimaker-cura/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-cura/",
|
||||
"repository": "https://github.com/linuxserver/docker-cura",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-04-19",
|
||||
"note": "Rebase to resolute."
|
||||
},
|
||||
{
|
||||
"date": "2026-03-29",
|
||||
"note": "Make Wayland default disable with PIXELFLUX_WAYLAND=false."
|
||||
},
|
||||
{
|
||||
"date": "2025-12-28",
|
||||
"note": "Add Wayland init logic, rebase to Noble."
|
||||
},
|
||||
{
|
||||
"date": "2025-07-12",
|
||||
"note": "Rebase to Selkies, HTTPS IS NOW REQUIRED."
|
||||
},
|
||||
{
|
||||
"date": "2024-06-03",
|
||||
"note": "Update ingestion from GitHub to handle RC releases."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-04-19"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-cura",
|
||||
"default_branch": "main",
|
||||
"revision": "1c918b361988df5bfad56ae4f001f6d9ecdb9e9f",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-cura/1c918b361988df5bfad56ae4f001f6d9ecdb9e9f/README.md",
|
||||
"readme_pushed_at": "2026-09-07T09:47:30Z",
|
||||
"compose_sha256": "a8be85a91cd3475f63ee37c5b1d5b99ed67d86d8d4edb574f7f92fd4e134e4ae",
|
||||
"generated_at": "2026-09-12T14:37:25+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "cura",
|
||||
"container_name": "cura",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/cura:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/cura",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "LC_ALL",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "upstream-documentation",
|
||||
"prompt": "Language/locale (e.g. es_ES.UTF-8; translation of every application is not guaranteed)"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/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": 3000,
|
||||
"published_example": 3000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 3001,
|
||||
"published_example": 3001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n cura:\n image: lscr.io/linuxserver/cura:latest\n container_name: cura\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/config:/config\n ports:\n - 3000:3000\n - 3001:3001\n shm_size: \"1gb\"\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
}
|
||||
],
|
||||
"installer_profile": {
|
||||
"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"
|
||||
]
|
||||
},
|
||||
{
|
||||
"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"
|
||||
]
|
||||
}
|
||||
],
|
||||
"selkies": {
|
||||
"base": "FROM ghcr.io/linuxserver/baseimage-selkies:ubunturesolute",
|
||||
"dockerfile_url": "https://raw.githubusercontent.com/linuxserver/docker-cura/master/Dockerfile",
|
||||
"dockerfile_sha256": "70e5f3133d0847de7ff4cf47ab0ad2872c3fbec48bfcd6e523611180b87dcbd4",
|
||||
"reviewed_on": "2026-09-16",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/",
|
||||
"nvidia": "not-offered-until-specific-host-and-image-validation",
|
||||
"validation": "profile-generated; real streaming workload pending"
|
||||
},
|
||||
"optional_devices": [],
|
||||
"hardware_acceleration": {
|
||||
"prompt": "Selkies desktop and streaming acceleration",
|
||||
"default": "none",
|
||||
"profiles": [
|
||||
{
|
||||
"id": "none",
|
||||
"label": "No GPU (CPU)",
|
||||
"device_requests": [],
|
||||
"environment": [
|
||||
{
|
||||
"name": "AUTO_GPU",
|
||||
"value": "false"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "vaapi",
|
||||
"label": "Intel/AMD (streaming rendering and encoding)",
|
||||
"device_requests": [
|
||||
{
|
||||
"id": "selkies-render",
|
||||
"kind": "character-device",
|
||||
"path_prompt": "Intel/AMD render node",
|
||||
"host_path_default": "/dev/dri/renderD128",
|
||||
"container_path_strategy": "same-as-host",
|
||||
"mode": "0660",
|
||||
"deny_write": false,
|
||||
"gid_strategy": "host-device-gid",
|
||||
"drm_vendor_ids": [
|
||||
"0x8086",
|
||||
"0x1002"
|
||||
]
|
||||
}
|
||||
],
|
||||
"environment": [
|
||||
{
|
||||
"name": "PIXELFLUX_WAYLAND",
|
||||
"value": "true"
|
||||
},
|
||||
{
|
||||
"name": "AUTO_GPU",
|
||||
"value": "false"
|
||||
}
|
||||
],
|
||||
"environment_from_devices": {
|
||||
"DRINODE": [
|
||||
"selkies-render"
|
||||
],
|
||||
"DRI_NODE": [
|
||||
"selkies-render"
|
||||
],
|
||||
"ATTACHED_DEVICES_PERMS": [
|
||||
"selkies-render"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"gpu_validation": {
|
||||
"device_inventory": "host-sysfs-and-stat",
|
||||
"application_acceleration": "requires-workload-test",
|
||||
"tone_mapping": "not-implied-by-device-access"
|
||||
},
|
||||
"device_permissions": {
|
||||
"strategy": "linuxserver-native-init",
|
||||
"service_user": "abc",
|
||||
"environment": "ATTACHED_DEVICES_PERMS",
|
||||
"paths": "all-resolved-selected-character-devices"
|
||||
}
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"shm_size",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,373 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-darktable",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Darktable"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "darktable is an open source photography workflow application and raw developer. A virtual lighttable and darkroom for photographers. It manages your digital negatives in a database, lets you view them through a zoomable lighttable and enables you to develop raw images and enhance them."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "darktable is an open source photography workflow application and raw developer. A virtual lighttable and darkroom for photographers. It manages your digital negatives in a database, lets you view them through a zoomable lighttable and enables you to develop raw images and enhance them."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/darktable-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/darktable-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://www.darktable.org/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-darktable/",
|
||||
"repository": "https://github.com/linuxserver/docker-darktable",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-04-03",
|
||||
"note": "Make Wayland default disable with PIXELFLUX_WAYLAND=false."
|
||||
},
|
||||
{
|
||||
"date": "2025-12-28",
|
||||
"note": "Add Wayland init logic."
|
||||
},
|
||||
{
|
||||
"date": "2025-07-12",
|
||||
"note": "Rebase to Selkies, HTTPS IS NOW REQUIRED."
|
||||
},
|
||||
{
|
||||
"date": "2024-02-10",
|
||||
"note": "Update Readme with new env vars and ingest proper PWA icon."
|
||||
},
|
||||
{
|
||||
"date": "2024-01-21",
|
||||
"note": "Rebase to Arch as Alpine not longer offers aarch64."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-04-03"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-darktable",
|
||||
"default_branch": "master",
|
||||
"revision": "dbda6422572a9b4441d04acc90833efe81845466",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-darktable/dbda6422572a9b4441d04acc90833efe81845466/README.md",
|
||||
"readme_pushed_at": "2026-08-31T15:21:14Z",
|
||||
"compose_sha256": "7cd2933e428a3e9257dee5b7760fc13060fb282aad44850f3de7caf1feaa7b2f",
|
||||
"generated_at": "2026-09-12T14:37:25+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "darktable",
|
||||
"container_name": "darktable",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/darktable:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/darktable",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "LC_ALL",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "upstream-documentation",
|
||||
"prompt": "Language/locale (e.g. es_ES.UTF-8; translation of every application is not guaranteed)"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/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": 3000,
|
||||
"published_example": 3000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 3001,
|
||||
"published_example": 3001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n darktable:\n image: lscr.io/linuxserver/darktable:latest\n container_name: darktable\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/config:/config\n ports:\n - 3000:3000\n - 3001:3001\n shm_size: \"1gb\"\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
}
|
||||
],
|
||||
"installer_profile": {
|
||||
"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"
|
||||
]
|
||||
},
|
||||
{
|
||||
"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"
|
||||
]
|
||||
}
|
||||
],
|
||||
"selkies": {
|
||||
"base": "FROM ghcr.io/linuxserver/baseimage-selkies:arch",
|
||||
"dockerfile_url": "https://raw.githubusercontent.com/linuxserver/docker-darktable/master/Dockerfile",
|
||||
"dockerfile_sha256": "c43ed3fbf915e09c477b73fd47dec0f1172f74a3943b04dea05325252415b76f",
|
||||
"reviewed_on": "2026-09-16",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/",
|
||||
"nvidia": "not-offered-until-specific-host-and-image-validation",
|
||||
"validation": "profile-generated; real streaming workload pending"
|
||||
},
|
||||
"optional_devices": [],
|
||||
"hardware_acceleration": {
|
||||
"prompt": "Selkies desktop and streaming acceleration",
|
||||
"default": "none",
|
||||
"profiles": [
|
||||
{
|
||||
"id": "none",
|
||||
"label": "No GPU (CPU)",
|
||||
"device_requests": [],
|
||||
"environment": [
|
||||
{
|
||||
"name": "AUTO_GPU",
|
||||
"value": "false"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "vaapi",
|
||||
"label": "Intel/AMD (streaming rendering and encoding)",
|
||||
"device_requests": [
|
||||
{
|
||||
"id": "selkies-render",
|
||||
"kind": "character-device",
|
||||
"path_prompt": "Intel/AMD render node",
|
||||
"host_path_default": "/dev/dri/renderD128",
|
||||
"container_path_strategy": "same-as-host",
|
||||
"mode": "0660",
|
||||
"deny_write": false,
|
||||
"gid_strategy": "host-device-gid",
|
||||
"drm_vendor_ids": [
|
||||
"0x8086",
|
||||
"0x1002"
|
||||
]
|
||||
}
|
||||
],
|
||||
"environment": [
|
||||
{
|
||||
"name": "PIXELFLUX_WAYLAND",
|
||||
"value": "true"
|
||||
},
|
||||
{
|
||||
"name": "AUTO_GPU",
|
||||
"value": "false"
|
||||
}
|
||||
],
|
||||
"environment_from_devices": {
|
||||
"DRINODE": [
|
||||
"selkies-render"
|
||||
],
|
||||
"DRI_NODE": [
|
||||
"selkies-render"
|
||||
],
|
||||
"ATTACHED_DEVICES_PERMS": [
|
||||
"selkies-render"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"gpu_validation": {
|
||||
"device_inventory": "host-sysfs-and-stat",
|
||||
"application_acceleration": "requires-workload-test",
|
||||
"tone_mapping": "not-implied-by-device-access"
|
||||
},
|
||||
"device_permissions": {
|
||||
"strategy": "linuxserver-native-init",
|
||||
"service_user": "abc",
|
||||
"environment": "ATTACHED_DEVICES_PERMS",
|
||||
"paths": "all-resolved-selected-character-devices"
|
||||
}
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"shm_size",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,393 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-databag",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Databag"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Messenger for the Decentralized Web"
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Databag is a federated chat app for self-hosting that focuses on user privacy and security; the service includes clients for iOS, Android, and browser."
|
||||
},
|
||||
"category": "communication",
|
||||
"category_label": "Communication & Community",
|
||||
"author": "balzack",
|
||||
"developer": "balzack",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 7000,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "",
|
||||
"documentation": null,
|
||||
"repository": "https://hub.docker.com/r/balzack/databag",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "balzack",
|
||||
"repository": "https://hub.docker.com/r/balzack/databag",
|
||||
"revision": "86b3017fe940de09f8842182d09281ac89b0f9be7725c25e5a1125906086bf2e",
|
||||
"image_repository_url": "https://hub.docker.com/r/balzack/databag",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "86b3017fe940de09f8842182d09281ac89b0f9be7725c25e5a1125906086bf2e",
|
||||
"generated_at": "2026-09-13T15:34:58+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "databag",
|
||||
"container_name": "databag",
|
||||
"image": {
|
||||
"reference": "balzack/databag:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "balzack/databag",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/var/lib/databag",
|
||||
"compose_source_example": "/DATA/AppData/databag/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": 7000,
|
||||
"published_example": 7000,
|
||||
"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: databag\nservices:\n databag:\n image: balzack/databag:latest\n restart: unless-stopped\n ports:\n - target: 7000\n published: 7000\n protocol: tcp\n volumes:\n - type: bind\n source: /DATA/AppData/databag/data\n target: /var/lib/databag\n container_name: databag\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "databag",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "databag",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "databag",
|
||||
"image": "balzack/databag:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"image": "balzack/databag:latest",
|
||||
"restart": "unless-stopped",
|
||||
"ports": [
|
||||
{
|
||||
"target": 7000,
|
||||
"published": 7000,
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/databag/data",
|
||||
"target": "/var/lib/databag"
|
||||
}
|
||||
],
|
||||
"container_name": "databag"
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "databag"
|
||||
},
|
||||
"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": "databag-volume-0",
|
||||
"service": "databag",
|
||||
"container_path": "/var/lib/databag",
|
||||
"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": [
|
||||
"databag"
|
||||
],
|
||||
"stop_order": [
|
||||
"databag"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 7000,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"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,257 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-davos",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Davos"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Davos is an FTP automation tool that periodically scans given host locations for new files. It can be configured for various purposes, including listening for specific files to appear in the host location, ready for it to download and then move, if required. It also supports completion notifications as well as downstream API calls, to further the workflow."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Davos is an FTP automation tool that periodically scans given host locations for new files. It can be configured for various purposes, including listening for specific files to appear in the host location, ready for it to download and then move, if required. It also supports completion notifications as well as downstream API calls, to further the workflow."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/davos-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/davos-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 8080,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://github.com/linuxserver/davos",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-davos/",
|
||||
"repository": "https://github.com/linuxserver/docker-davos",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2025-01-27",
|
||||
"note": "Rebase to Alpine 3.21."
|
||||
},
|
||||
{
|
||||
"date": "2024-06-24",
|
||||
"note": "Rebase to Alpine 3.20."
|
||||
},
|
||||
{
|
||||
"date": "2024-03-20",
|
||||
"note": "Rebase to Alpine 3.19."
|
||||
},
|
||||
{
|
||||
"date": "2023-07-12",
|
||||
"note": "Rebase to Alpine 3.18."
|
||||
},
|
||||
{
|
||||
"date": "2023-07-07",
|
||||
"note": "Deprecate armhf. As announced [here](https://www.linuxserver.io/blog/a-farewell-to-arm-hf)"
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2025-01-27"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-davos",
|
||||
"default_branch": "master",
|
||||
"revision": "417449f0627091795348596bae78c970a96cd423",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-davos/417449f0627091795348596bae78c970a96cd423/README.md",
|
||||
"readme_pushed_at": "2025-11-21T18:46:32Z",
|
||||
"compose_sha256": "83916341351e702904a000b98f2b63bc43b85f8194162479464a0ba74d7cc622",
|
||||
"generated_at": "2026-09-12T14:37:25+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "davos",
|
||||
"container_name": "davos",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/davos:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/davos",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/davos/data",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 4
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-1",
|
||||
"container_path": "/download",
|
||||
"compose_source_example": "/path/to/downloads/folder",
|
||||
"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": 8080,
|
||||
"published_example": 8080,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n davos:\n image: lscr.io/linuxserver/davos:latest\n container_name: davos\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/davos/data:/config\n - /path/to/downloads/folder:/download\n ports:\n - 8080:8080\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 8080,
|
||||
"path": "/",
|
||||
"source": "compose-first-tcp-port-fallback"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,225 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-ddclient",
|
||||
"status": "laboratory-validated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Ddclient"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Ddclient is a Perl client used to update dynamic DNS entries for accounts on Dynamic DNS Network Service Provider. It was originally written by Paul Burry and is now mostly by wimpunk. It has the capability to update more than just dyndns and it can fetch your WAN-ipaddress in a few different ways."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Ddclient is a Perl client used to update dynamic DNS entries for accounts on Dynamic DNS Network Service Provider. It was originally written by Paul Burry and is now mostly by wimpunk. It has the capability to update more than just dyndns and it can fetch your WAN-ipaddress in a few different ways."
|
||||
},
|
||||
"category": "network",
|
||||
"category_label": "Network & Firewall",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/ddclient-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/ddclient-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": null,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://github.com/ddclient/ddclient",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-ddclient/",
|
||||
"repository": "https://github.com/linuxserver/docker-ddclient",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2025-07-10",
|
||||
"note": "Rebase to Alpine 3.22."
|
||||
},
|
||||
{
|
||||
"date": "2024-07-08",
|
||||
"note": "Fix cache issue."
|
||||
},
|
||||
{
|
||||
"date": "2024-07-08",
|
||||
"note": "Don't copy config from `/config/ddclient.conf` to `/ddclient.conf` at runtime."
|
||||
},
|
||||
{
|
||||
"date": "2024-06-27",
|
||||
"note": "Rebase to Alpine 3.20."
|
||||
},
|
||||
{
|
||||
"date": "2023-12-23",
|
||||
"note": "Rebase to Alpine 3.19."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2025-07-10"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-ddclient",
|
||||
"default_branch": "master",
|
||||
"revision": "ed4e3b047328be36aa8ef4f30257e0abe5e885b6",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-ddclient/ed4e3b047328be36aa8ef4f30257e0abe5e885b6/README.md",
|
||||
"readme_pushed_at": "2026-09-08T11:59:00Z",
|
||||
"compose_sha256": "89d3a953e0914852da81376043c40f101bf90159d68ed5178589433739f064d2",
|
||||
"generated_at": "2026-09-12T14:37:25+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "ddclient",
|
||||
"container_name": "ddclient",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/ddclient:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/ddclient",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/ddclient/config",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 4
|
||||
}
|
||||
}
|
||||
],
|
||||
"ports": [],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n ddclient:\n image: lscr.io/linuxserver/ddclient:latest\n container_name: ddclient\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/ddclient/config:/config\n restart: unless-stopped\n"
|
||||
},
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "passed-amd64",
|
||||
"service_health": "passed-amd64",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,401 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-ddns-go",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "ddns-go"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Simple and easy to use DDNS"
|
||||
},
|
||||
"description": {
|
||||
"en_US": "A simple and easy-to-use DDNS tool. Automatically updates domain name resolution to your public IP (supports Alibaba Cloud, Tencent Cloud, Dnspod, Cloudflare, Callback, Huawei Cloud, Baidu Cloud, Porkbun, GoDaddy, and Google Domain).\n\nDeploy DDNS-go on self-hosted server, and you can bind the public IP of your self-hosted server device to your domain name. This way, you can access your self-hosted server device via the domain name while you are away.\n"
|
||||
},
|
||||
"category": "network",
|
||||
"category_label": "Network & Firewall",
|
||||
"author": "jeessy2",
|
||||
"developer": "jeessy2",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 9876,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "",
|
||||
"documentation": null,
|
||||
"repository": "https://hub.docker.com/r/jeessy/ddns-go",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "jeessy",
|
||||
"repository": "https://hub.docker.com/r/jeessy/ddns-go",
|
||||
"revision": "31ce4e8b497a15a2da1f56f7fdf3ad9ef1c41b0521b35ae9fdbf75dc4c5293c8",
|
||||
"image_repository_url": "https://hub.docker.com/r/jeessy/ddns-go",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "31ce4e8b497a15a2da1f56f7fdf3ad9ef1c41b0521b35ae9fdbf75dc4c5293c8",
|
||||
"generated_at": "2026-09-13T15:34:58+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "ddns-go",
|
||||
"container_name": "ddns-go",
|
||||
"image": {
|
||||
"reference": "jeessy/ddns-go:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "jeessy/ddns-go",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/root",
|
||||
"compose_source_example": "/DATA/AppData/$AppID/config",
|
||||
"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": 9876,
|
||||
"published_example": 9876,
|
||||
"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: ddns-go\nservices:\n ddns-go:\n image: jeessy/ddns-go:latest\n network_mode: bridge\n deploy:\n resources:\n reservations:\n memory: 32M\n restart: unless-stopped\n volumes:\n - type: bind\n source: /DATA/AppData/$AppID/config\n target: /root\n ports:\n - target: 9876\n published: '9876'\n protocol: tcp\n container_name: ddns-go\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "ddns-go",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "ddns-go",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "ddns-go",
|
||||
"image": "jeessy/ddns-go:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"image": "jeessy/ddns-go:latest",
|
||||
"network_mode": "bridge",
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "32M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"restart": "unless-stopped",
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/config",
|
||||
"target": "/root"
|
||||
}
|
||||
],
|
||||
"ports": [
|
||||
{
|
||||
"target": 9876,
|
||||
"published": "9876",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"container_name": "ddns-go"
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "ddns-go"
|
||||
},
|
||||
"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": "ddns-go-volume-0",
|
||||
"service": "ddns-go",
|
||||
"container_path": "/root",
|
||||
"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": [
|
||||
"ddns-go"
|
||||
],
|
||||
"stop_order": [
|
||||
"ddns-go"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 9876,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"credentials": []
|
||||
},
|
||||
"proxmox": {
|
||||
"runtime": "native-oci-lxc",
|
||||
"technology_status": "proxmox-technology-preview",
|
||||
"defaults": {
|
||||
"unprivileged": true,
|
||||
"ostype": "auto-from-image",
|
||||
"cores": 2,
|
||||
"memory_mb": 128,
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"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,552 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-ddns-updater",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "ddns-updater"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Simple and easy to use DDNS"
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Program to keep DNS A and/or AAAA records updated for multiple DNS providers"
|
||||
},
|
||||
"category": "network",
|
||||
"category_label": "Network & Firewall",
|
||||
"author": "qmcgaw",
|
||||
"developer": "qmcgaw",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 8000,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "",
|
||||
"documentation": null,
|
||||
"repository": "https://hub.docker.com/r/qmcgaw/ddns-updater",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "qmcgaw",
|
||||
"repository": "https://hub.docker.com/r/qmcgaw/ddns-updater",
|
||||
"revision": "dc9ae469cfe5fcbfba2a840dd40b57eeedda3125499d2c92236830d6062dce10",
|
||||
"image_repository_url": "https://hub.docker.com/r/qmcgaw/ddns-updater",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "dc9ae469cfe5fcbfba2a840dd40b57eeedda3125499d2c92236830d6062dce10",
|
||||
"generated_at": "2026-09-13T15:34:58+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "ddns-updater",
|
||||
"container_name": "ddns-updater",
|
||||
"image": {
|
||||
"reference": "qmcgaw/ddns-updater:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "qmcgaw/ddns-updater",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "BACKUP_DIRECTORY",
|
||||
"example": "/updater/data",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "BACKUP_PERIOD",
|
||||
"example": "0",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "CONFIG",
|
||||
"example": "",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "HTTP_TIMEOUT",
|
||||
"example": "10s",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "LISTENING_ADDRESS",
|
||||
"example": ":8000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "LOG_CALLER",
|
||||
"example": "hidden",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "LOG_LEVEL",
|
||||
"example": "info",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "PERIOD",
|
||||
"example": "5m",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "PUBLICIP_DNS_PROVIDERS",
|
||||
"example": "all",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "PUBLICIP_DNS_TIMEOUT",
|
||||
"example": "3s",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "PUBLICIP_FETCHERS",
|
||||
"example": "all",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "PUBLICIP_HTTP_PROVIDERS",
|
||||
"example": "all",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "PUBLICIPV4_HTTP_PROVIDERS",
|
||||
"example": "all",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "PUBLICIPV6_HTTP_PROVIDERS",
|
||||
"example": "all",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "ROOT_URL",
|
||||
"example": "/",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "SHOUTRRR_ADDRESSES",
|
||||
"example": "",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "UPDATE_COOLDOWN_PERIOD",
|
||||
"example": "5m",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/updater/data",
|
||||
"compose_source_example": "/DATA/AppData/$AppID/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": 8000,
|
||||
"published_example": 8000,
|
||||
"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: ddns-updater\nservices:\n ddns-updater:\n image: qmcgaw/ddns-updater:latest\n network_mode: bridge\n command:\n - touch /data/config.json\n container_name: ddns-updater\n deploy:\n resources:\n limits:\n memory: 32M\n environment:\n - BACKUP_DIRECTORY=/updater/data\n - BACKUP_PERIOD=0\n - CONFIG=\n - HTTP_TIMEOUT=10s\n - LISTENING_ADDRESS=:8000\n - LOG_CALLER=hidden\n - LOG_LEVEL=info\n - PERIOD=5m\n - PUBLICIP_DNS_PROVIDERS=all\n - PUBLICIP_DNS_TIMEOUT=3s\n - PUBLICIP_FETCHERS=all\n - PUBLICIP_HTTP_PROVIDERS=all\n - PUBLICIPV4_HTTP_PROVIDERS=all\n - PUBLICIPV6_HTTP_PROVIDERS=all\n - ROOT_URL=/\n - SHOUTRRR_ADDRESSES=\n - UPDATE_COOLDOWN_PERIOD=5m\n hostname: ddns-updater\n ports:\n - target: 8000\n published: '8000'\n protocol: tcp\n restart: unless-stopped\n volumes:\n - type: bind\n source: /DATA/AppData/$AppID/data\n target: /updater/data\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "ddns-updater",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "ddns-updater",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "ddns-updater",
|
||||
"image": "qmcgaw/ddns-updater:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"image": "qmcgaw/ddns-updater:latest",
|
||||
"network_mode": "bridge",
|
||||
"command": [
|
||||
"touch /data/config.json"
|
||||
],
|
||||
"container_name": "ddns-updater",
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"limits": {
|
||||
"memory": "32M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"environment": [
|
||||
"BACKUP_DIRECTORY=/updater/data",
|
||||
"BACKUP_PERIOD=0",
|
||||
"CONFIG=",
|
||||
"HTTP_TIMEOUT=10s",
|
||||
"LISTENING_ADDRESS=:8000",
|
||||
"LOG_CALLER=hidden",
|
||||
"LOG_LEVEL=info",
|
||||
"PERIOD=5m",
|
||||
"PUBLICIP_DNS_PROVIDERS=all",
|
||||
"PUBLICIP_DNS_TIMEOUT=3s",
|
||||
"PUBLICIP_FETCHERS=all",
|
||||
"PUBLICIP_HTTP_PROVIDERS=all",
|
||||
"PUBLICIPV4_HTTP_PROVIDERS=all",
|
||||
"PUBLICIPV6_HTTP_PROVIDERS=all",
|
||||
"ROOT_URL=/",
|
||||
"SHOUTRRR_ADDRESSES=",
|
||||
"UPDATE_COOLDOWN_PERIOD=5m"
|
||||
],
|
||||
"hostname": "ddns-updater",
|
||||
"ports": [
|
||||
{
|
||||
"target": 8000,
|
||||
"published": "8000",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"restart": "unless-stopped",
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/data",
|
||||
"target": "/updater/data"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "ddns-updater"
|
||||
},
|
||||
"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": "ddns-updater-volume-0",
|
||||
"service": "ddns-updater",
|
||||
"container_path": "/updater/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": [
|
||||
"ddns-updater"
|
||||
],
|
||||
"stop_order": [
|
||||
"ddns-updater"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 8000,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"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"
|
||||
},
|
||||
"installer_profile": {
|
||||
"runtime": {
|
||||
"command": [
|
||||
"touch /data/config.json"
|
||||
],
|
||||
"hostname": "ddns-updater"
|
||||
}
|
||||
},
|
||||
"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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-privileged-mode",
|
||||
"upstream_behavior": "Compose selects whether the container runs in privileged mode.",
|
||||
"native_lxc_behavior": "ProxMenux uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"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,476 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-deepseek-ocr-nvidia",
|
||||
"status": "generated-review-required",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "DeepSeek OCR(Nvidia GPU)"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Powerful OCR powered by DeepSeek AI"
|
||||
},
|
||||
"description": {
|
||||
"en_US": "DeepSeek OCR is a powerful open-source OCR (Optical Character Recognition) tool based on the advanced DeepSeek-AI model. It enables accurate text extraction from images and document scans via a user-friendly web interface and API. Supports various image formats and offers configurations for image size, cropping, and upload limits. Additionally, DeepSeek OCR features four core recognition modes: Plain OCR for raw text extraction, Describe for intelligent image content descriptions, Find for keyword localization with visual bounding box returns, and Freeform for flexible image understanding tasks based on custom prompts.\n\n**Key Features:**\n- High-accuracy text recognition with DeepSeek-OCR, supporting images and multi-page PDF documents\n- Preserves document layout including tables, formulas, and structural formatting\n- Web frontend (React) and REST API (FastAPI) for easy usage and system integration\n- Export results to Markdown, HTML, DOCX, or JSON formats\n- Automatic extraction and embedding of images from PDF files\n- GPU acceleration and Docker deployment for fast and scalable processing\n\n**Prerequisites:**\n- self-hosted server version 1.5.2 or higher, or NVIDIA Open Driver version 580 or higher\n- NVIDIA GPU with >= 8 GB VRAM for optimal performance\n\n**Learn More:**\n- [DeepSeek OCR App (GitHub)](https://github.com/rdumasia303/deepseek_ocr_app)\n"
|
||||
},
|
||||
"category": "ai",
|
||||
"category_label": "AI / Coding & Dev-Tools",
|
||||
"author": "rdumasia303",
|
||||
"developer": "rdumasia303",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 80,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "",
|
||||
"documentation": null,
|
||||
"repository": "https://hub.docker.com/r/icewhaletech/deepseek-ocr-frontend",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null,
|
||||
"hidden": true,
|
||||
"hidden_reason": "Pending multi-container adaptation; retained for future work"
|
||||
},
|
||||
"source": {
|
||||
"provider": "icewhaletech",
|
||||
"repository": "https://hub.docker.com/r/icewhaletech/deepseek-ocr-frontend",
|
||||
"revision": "c8e9a7bebed9e83d7ffedceb9e118c90f489049e456276054d3e344cb1f1e1fe",
|
||||
"image_repository_url": "https://hub.docker.com/r/icewhaletech/deepseek-ocr-frontend",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "c8e9a7bebed9e83d7ffedceb9e118c90f489049e456276054d3e344cb1f1e1fe",
|
||||
"generated_at": "2026-09-13T15:48:22+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "deepseek-ocr-frontend",
|
||||
"container_name": "deepseek-ocr-frontend",
|
||||
"image": {
|
||||
"reference": "icewhaletech/deepseek-ocr-frontend:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "icewhaletech/deepseek-ocr-frontend",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [],
|
||||
"volumes": [],
|
||||
"ports": [
|
||||
{
|
||||
"container_port": 80,
|
||||
"published_example": 23000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [
|
||||
{
|
||||
"name": "deepseek-ocr-backend",
|
||||
"image": "icewhaletech/deepseek-ocr-backend:latest"
|
||||
}
|
||||
],
|
||||
"restart": null,
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "name: deepseek-ocr-nvidia\nservices:\n deepseek-ocr-backend:\n image: icewhaletech/deepseek-ocr-backend:latest\n container_name: deepseek-ocr-backend\n environment:\n API_HOST: 0.0.0.0\n API_PORT: '8000'\n FRONTEND_PORT: '3000'\n MODEL_NAME: deepseek-ai/DeepSeek-OCR\n HF_HOME: /models\n MAX_UPLOAD_SIZE_MB: '100'\n BASE_SIZE: '1024'\n IMAGE_SIZE: '640'\n CROP_MODE: 'true'\n volumes:\n - /DATA/AppData/$AppID/models:/models\n deploy:\n resources:\n reservations:\n devices:\n - driver: nvidia\n count: all\n capabilities:\n - gpu\n memory: 8G\n shm_size: 4g\n ports:\n - target: 8000\n published: '22523'\n protocol: tcp\n networks:\n - deepseek-ocr-network\n deepseek-ocr-frontend:\n image: icewhaletech/deepseek-ocr-frontend:latest\n container_name: deepseek-ocr-frontend\n ports:\n - target: 80\n published: '23000'\n protocol: tcp\n deploy:\n resources:\n reservations:\n memory: 512M\n depends_on:\n - deepseek-ocr-backend\n networks:\n - deepseek-ocr-network\nnetworks:\n deepseek-ocr-network:\n driver: bridge\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "deepseek-ocr-nvidia",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "deepseek-ocr-frontend",
|
||||
"service_count": 2,
|
||||
"services": [
|
||||
{
|
||||
"name": "deepseek-ocr-backend",
|
||||
"image": "icewhaletech/deepseek-ocr-backend:latest",
|
||||
"is_main": false,
|
||||
"role": "dependency",
|
||||
"vmid_offset": 1,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": true,
|
||||
"compose": {
|
||||
"image": "icewhaletech/deepseek-ocr-backend:latest",
|
||||
"container_name": "deepseek-ocr-backend",
|
||||
"environment": {
|
||||
"API_HOST": "0.0.0.0",
|
||||
"API_PORT": "8000",
|
||||
"FRONTEND_PORT": "3000",
|
||||
"MODEL_NAME": "deepseek-ai/DeepSeek-OCR",
|
||||
"HF_HOME": "/models",
|
||||
"MAX_UPLOAD_SIZE_MB": "100",
|
||||
"BASE_SIZE": "1024",
|
||||
"IMAGE_SIZE": "640",
|
||||
"CROP_MODE": "true"
|
||||
},
|
||||
"volumes": [
|
||||
"/DATA/AppData/$AppID/models:/models"
|
||||
],
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"devices": [
|
||||
{
|
||||
"driver": "nvidia",
|
||||
"count": "all",
|
||||
"capabilities": [
|
||||
"gpu"
|
||||
]
|
||||
}
|
||||
],
|
||||
"memory": "8G"
|
||||
}
|
||||
}
|
||||
},
|
||||
"shm_size": "4g",
|
||||
"ports": [
|
||||
{
|
||||
"target": 8000,
|
||||
"published": "22523",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"networks": [
|
||||
"deepseek-ocr-network"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "deepseek-ocr-frontend",
|
||||
"image": "icewhaletech/deepseek-ocr-frontend:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [
|
||||
"deepseek-ocr-backend"
|
||||
],
|
||||
"frontend_network": true,
|
||||
"private_network": true,
|
||||
"compose": {
|
||||
"image": "icewhaletech/deepseek-ocr-frontend:latest",
|
||||
"container_name": "deepseek-ocr-frontend",
|
||||
"ports": [
|
||||
{
|
||||
"target": 80,
|
||||
"published": "23000",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "512M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"depends_on": [
|
||||
"deepseek-ocr-backend"
|
||||
],
|
||||
"networks": [
|
||||
"deepseek-ocr-network"
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "deepseek-ocr-nvidia",
|
||||
"networks": {
|
||||
"deepseek-ocr-network": {
|
||||
"driver": "bridge"
|
||||
}
|
||||
}
|
||||
},
|
||||
"networking": {
|
||||
"frontend": "selected-proxmox-bridge",
|
||||
"private_required": true,
|
||||
"private_creation": "automatic-create-if-missing",
|
||||
"private_address_allocation": "automatic-static-address-per-service",
|
||||
"service_discovery": "private-addresses-with-compose-service-host-aliases",
|
||||
"dependency_external_access": "disabled-unless-service-publishes-ports",
|
||||
"prompt_user_for_private_network": false
|
||||
},
|
||||
"storage": [
|
||||
{
|
||||
"id": "deepseek-ocr-backend-volume-0",
|
||||
"service": "deepseek-ocr-backend",
|
||||
"container_path": "/models",
|
||||
"mode": "managed-volume",
|
||||
"user_selectable": false,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"source_path": null,
|
||||
"source_path_prompt": null
|
||||
}
|
||||
],
|
||||
"orchestration": {
|
||||
"reserve_vmids_atomically": 2,
|
||||
"start_order": [
|
||||
"deepseek-ocr-backend",
|
||||
"deepseek-ocr-frontend"
|
||||
],
|
||||
"stop_order": [
|
||||
"deepseek-ocr-frontend",
|
||||
"deepseek-ocr-backend"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 80,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"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": 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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"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"
|
||||
}
|
||||
],
|
||||
"generic_stack_review": [
|
||||
"deepseek-ocr-backend: perfil de salud y persistencia pendiente"
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": false,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"cap_add",
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"sysctls",
|
||||
"tty",
|
||||
"user",
|
||||
"volumes",
|
||||
"working_dir"
|
||||
],
|
||||
"untranslated_blockers": [
|
||||
"multi-service-compose",
|
||||
"compose-key:depends_on",
|
||||
"native-multi-lxc-orchestrator-not-yet-implemented"
|
||||
],
|
||||
"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,293 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-deluge",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Deluge"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Deluge is a lightweight, Free Software, cross-platform BitTorrent client."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Deluge is a lightweight, Free Software, cross-platform BitTorrent client."
|
||||
},
|
||||
"category": "downloads",
|
||||
"category_label": "Files & Downloads",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/deluge-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/deluge-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 8112,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "http://deluge-torrent.org/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-deluge/",
|
||||
"repository": "https://github.com/linuxserver/docker-deluge",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-04-02",
|
||||
"note": "Install from pypi due to Alpine geoip package deprecation."
|
||||
},
|
||||
{
|
||||
"date": "2025-12-29",
|
||||
"note": "Fix some issues with GeoIP updates."
|
||||
},
|
||||
{
|
||||
"date": "2025-08-23",
|
||||
"note": "Update GeoIP provider, add weekly cronjob to update."
|
||||
},
|
||||
{
|
||||
"date": "2025-01-12",
|
||||
"note": "Rebase libtorrentv1 branch to Alpine 3.21."
|
||||
},
|
||||
{
|
||||
"date": "2024-09-19",
|
||||
"note": "Prevent race condition related delay during container stop."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-04-02"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-deluge",
|
||||
"default_branch": "master",
|
||||
"revision": "9f6c513aabbf37a820d887e2c41b6f20cdb98e0a",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-deluge/9f6c513aabbf37a820d887e2c41b6f20cdb98e0a/README.md",
|
||||
"readme_pushed_at": "2026-09-07T19:33:30Z",
|
||||
"compose_sha256": "504673c02864a4a1e9a9ec7bf2a9f4c3d12c1219db86e6868651e13d12539b4a",
|
||||
"generated_at": "2026-09-12T14:37:25+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "deluge",
|
||||
"container_name": "deluge",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/deluge:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/deluge",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "DELUGE_LOGLEVEL",
|
||||
"example": "error",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/deluge/config",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 4
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-1",
|
||||
"container_path": "/downloads",
|
||||
"compose_source_example": "/path/to/downloads",
|
||||
"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": 8112,
|
||||
"published_example": 8112,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 6881,
|
||||
"published_example": 6881,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 6881,
|
||||
"published_example": 6881,
|
||||
"protocol": "udp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 58846,
|
||||
"published_example": 58846,
|
||||
"protocol": "tcp",
|
||||
"required": false,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n deluge:\n image: lscr.io/linuxserver/deluge:latest\n container_name: deluge\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n - DELUGE_LOGLEVEL=error #optional\n volumes:\n - /path/to/deluge/config:/config\n - /path/to/downloads:/downloads\n ports:\n - 8112:8112\n - 6881:6881\n - 6881:6881/udp\n - 58846:58846 #optional\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 8112,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"credentials": [
|
||||
{
|
||||
"label": "Default login",
|
||||
"username": "admin",
|
||||
"password": "deluge",
|
||||
"change_required": true,
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
]
|
||||
},
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,272 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-digikam",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Digikam"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "digiKam: Professional Photo Management with the Power of Open Source"
|
||||
},
|
||||
"description": {
|
||||
"en_US": "digiKam: Professional Photo Management with the Power of Open Source"
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/digikam-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/digikam-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://www.digikam.org/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-digikam/",
|
||||
"repository": "https://github.com/linuxserver/docker-digikam",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-04-03",
|
||||
"note": "Make Wayland default disable with PIXELFLUX_WAYLAND=false."
|
||||
},
|
||||
{
|
||||
"date": "2026-03-21",
|
||||
"note": "Use Wayland ozone platform for chromium fixes scaling and acceleration."
|
||||
},
|
||||
{
|
||||
"date": "2025-12-28",
|
||||
"note": "Add Wayland init logic."
|
||||
},
|
||||
{
|
||||
"date": "2025-09-22",
|
||||
"note": "Rebase to Debian Trixie."
|
||||
},
|
||||
{
|
||||
"date": "2025-07-28",
|
||||
"note": "Fix CPU usage bug by disabling fake udev."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-04-03"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-digikam",
|
||||
"default_branch": "master",
|
||||
"revision": "9021291eab201301bc2bef11e3492f6d36b1c901",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-digikam/9021291eab201301bc2bef11e3492f6d36b1c901/README.md",
|
||||
"readme_pushed_at": "2026-09-07T18:35:56Z",
|
||||
"compose_sha256": "3141590f071938a0ab35a48c8fd81ef99b7195f9dfe078d02aa5c033f159a598",
|
||||
"generated_at": "2026-09-12T14:37:25+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "digikam",
|
||||
"container_name": "digikam",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/digikam:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/digikam",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/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": 3000,
|
||||
"published_example": 3000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 3001,
|
||||
"published_example": 3001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n digikam:\n image: lscr.io/linuxserver/digikam:latest\n container_name: digikam\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/config:/config\n ports:\n - 3000:3000\n - 3001:3001\n shm_size: \"1gb\"\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
}
|
||||
],
|
||||
"installer_profile": {
|
||||
"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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"shm_size",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,600 @@
|
||||
{
|
||||
"schema_version": "0.4.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-diskover",
|
||||
"status": "generated-review-required",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Diskover"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "diskover is an open source file system indexer that uses Elasticsearch to index and manage data across heterogeneous storage systems."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "diskover is an open source file system indexer that uses Elasticsearch to index and manage data across heterogeneous storage systems."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/diskover-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/diskover-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 80,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://github.com/diskoverdata/diskover-community",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-diskover/",
|
||||
"repository": "https://github.com/linuxserver/docker-diskover",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2024-09-06",
|
||||
"note": "Rebase to Alpine 3.20. Existing users should update their nginx confs to avoid http2 deprecation warnings."
|
||||
},
|
||||
{
|
||||
"date": "2024-03-06",
|
||||
"note": "Existing users should update: site-confs/default.conf - Cleanup default site conf."
|
||||
},
|
||||
{
|
||||
"date": "2024-03-06",
|
||||
"note": "Rebase to Alpine 3.19 with php 8.3."
|
||||
},
|
||||
{
|
||||
"date": "2023-05-25",
|
||||
"note": "Rebase to Alpine 3.18, deprecate armhf."
|
||||
},
|
||||
{
|
||||
"date": "2023-04-13",
|
||||
"note": "Move ssl.conf include to default.conf."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2024-09-06",
|
||||
"hidden": true,
|
||||
"hidden_reason": "Pending multi-container adaptation; retained for future work"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-diskover",
|
||||
"default_branch": "master",
|
||||
"revision": "ccd08155ea8dea36794c4f4b3d56c3a9be4d9f4e",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-diskover/ccd08155ea8dea36794c4f4b3d56c3a9be4d9f4e/README.md",
|
||||
"readme_pushed_at": "2026-09-10T14:55:45Z",
|
||||
"compose_sha256": "160f74a3ded1b800740c6b9125da52b39f121da1b8a41cc0d1774d57a909cbb7",
|
||||
"generated_at": "2026-09-13T15:48:25+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "diskover",
|
||||
"container_name": "diskover",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/diskover:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/diskover",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "America/New_York",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "ES_HOST",
|
||||
"example": "elasticsearch",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "ES_PORT",
|
||||
"example": "9200",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/diskover/config",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 4
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-1",
|
||||
"container_path": "/data",
|
||||
"compose_source_example": "/path/to/diskover/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": [
|
||||
{
|
||||
"name": "elasticsearch",
|
||||
"image": "docker.elastic.co/elasticsearch/elasticsearch:7.17.22"
|
||||
},
|
||||
{
|
||||
"name": "elasticsearch-helper",
|
||||
"image": "alpine"
|
||||
}
|
||||
],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "version: '2'\nservices:\n diskover:\n image: lscr.io/linuxserver/diskover\n container_name: diskover\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=America/New_York\n - ES_HOST=elasticsearch\n - ES_PORT=9200\n volumes:\n - /path/to/diskover/config:/config\n - /path/to/diskover/data:/data\n ports:\n - 80:80\n mem_limit: 4096m\n restart: unless-stopped\n depends_on:\n - elasticsearch\n elasticsearch:\n container_name: elasticsearch\n image: docker.elastic.co/elasticsearch/elasticsearch:7.17.22\n environment:\n - discovery.type=single-node\n - xpack.security.enabled=false\n - bootstrap.memory_lock=true\n - \"ES_JAVA_OPTS=-Xms1g -Xmx1g\"\n ulimits:\n memlock:\n soft: -1\n hard: -1\n volumes:\n - /path/to/esdata:/usr/share/elasticsearch/data\n ports:\n - 9200:9200\n depends_on:\n - elasticsearch-helper\n restart: unless-stopped\n elasticsearch-helper:\n image: alpine\n command: sh -c \"sysctl -w vm.max_map_count=262144\"\n privileged: true\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 80,
|
||||
"path": "/",
|
||||
"source": "compose-first-tcp-port-fallback"
|
||||
}
|
||||
],
|
||||
"credentials": []
|
||||
},
|
||||
"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": 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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-command",
|
||||
"upstream_behavior": "Compose replaces the image Cmd while retaining its Entrypoint.",
|
||||
"native_lxc_behavior": "ProxMenux reads the official OCI Entrypoint and combines it with the Compose command as the native LXC init command.",
|
||||
"reason": "Proxmox stores the effective OCI process as one entrypoint string.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-process-runtime",
|
||||
"upstream_behavior": "Compose can replace Entrypoint, User and WorkingDir and request an init process or interactive terminal.",
|
||||
"native_lxc_behavior": "ProxMenux applies the process overrides through native LXC init directives; lxc-init provides PID 1 supervision and the CT console provides terminal access.",
|
||||
"reason": "The OCI process must start with the same identity, command and working directory without Docker.",
|
||||
"behavioral_impact": "Compose stdin_open and tty become access through the Proxmox LXC console.",
|
||||
"validation": "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-network-identity",
|
||||
"upstream_behavior": "Compose can set hostname, MAC address, extra hosts and attach a service to Docker networks.",
|
||||
"native_lxc_behavior": "ProxMenux applies hostname and MAC to net0, writes additional host aliases into the LXC and uses its dedicated bridge connection for single-service networks.",
|
||||
"reason": "A dedicated LXC has its own network namespace and does not need a Docker bridge per service.",
|
||||
"behavioral_impact": "host-gateway resolves to the IPv4 address of the selected Proxmox bridge.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-network-mode",
|
||||
"upstream_behavior": "Docker host mode removes Docker network isolation; bridge and default use a Docker-managed network.",
|
||||
"native_lxc_behavior": "The OCI process uses the dedicated LXC network namespace directly, so host, bridge and default all listen on the LXC address without Docker NAT.",
|
||||
"reason": "The LXC is the application host and already has its own address and port namespace.",
|
||||
"behavioral_impact": "host means the LXC host, never the Proxmox host; this preserves Proxmox network isolation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-capabilities-and-sysctls",
|
||||
"upstream_behavior": "Compose can add Linux capabilities and set kernel parameters in the container network namespace.",
|
||||
"native_lxc_behavior": "ProxMenux validates requested capabilities against the native LXC capability set and writes namespaced network settings as lxc.sysctl directives.",
|
||||
"reason": "A native OCI-LXC already starts with the namespaced capability set; lxc.cap.keep would incorrectly discard unrelated required capabilities.",
|
||||
"behavioral_impact": "Host-global capabilities such as SYS_MODULE remain blocked until their host prerequisite is explicitly adapted.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "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": "pending-per-application"
|
||||
}
|
||||
],
|
||||
"installer_profile": {
|
||||
"resources": {
|
||||
"memory_default_mb": 4096
|
||||
}
|
||||
},
|
||||
"generic_stack_review": [
|
||||
"elasticsearch-helper: perfil de salud y persistencia pendiente",
|
||||
"elasticsearch-helper: privileged necesita revision de pila",
|
||||
"elasticsearch: perfil de salud y persistencia pendiente"
|
||||
],
|
||||
"stack_adaptation_notes": [
|
||||
"mem_limit is translated to the editable Proxmox memory default; ulimits is translated to native lxc.prlimit entries.",
|
||||
"The upstream original_compose uses Elasticsearch 7.17.22. The normalized catalog candidate uses latest; tag availability and application compatibility must be reviewed before enabling installation.",
|
||||
"The privileged elasticsearch-helper modifies host vm.max_map_count. No host sysctl is changed and this helper must not be discarded silently.",
|
||||
"Elasticsearch persistence, healthchecks and host requirements still block the native stack."
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": false,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"cap_add",
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"sysctls",
|
||||
"tty",
|
||||
"user",
|
||||
"volumes",
|
||||
"working_dir"
|
||||
],
|
||||
"untranslated_blockers": [
|
||||
"multi-service-compose",
|
||||
"compose-key:depends_on",
|
||||
"native-multi-lxc-orchestrator-not-yet-implemented"
|
||||
],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "diskover",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "diskover",
|
||||
"service_count": 3,
|
||||
"services": [
|
||||
{
|
||||
"name": "elasticsearch-helper",
|
||||
"image": "alpine:latest",
|
||||
"is_main": false,
|
||||
"role": "dependency",
|
||||
"vmid_offset": 1,
|
||||
"depends_on": [],
|
||||
"frontend_network": false,
|
||||
"private_network": true,
|
||||
"compose": {
|
||||
"image": "alpine",
|
||||
"command": "sh -c \"sysctl -w vm.max_map_count=262144\"",
|
||||
"privileged": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "elasticsearch",
|
||||
"image": "docker.elastic.co/elasticsearch/elasticsearch:latest",
|
||||
"is_main": false,
|
||||
"role": "dependency",
|
||||
"vmid_offset": 2,
|
||||
"depends_on": [
|
||||
"elasticsearch-helper"
|
||||
],
|
||||
"frontend_network": true,
|
||||
"private_network": true,
|
||||
"compose": {
|
||||
"container_name": "elasticsearch",
|
||||
"image": "docker.elastic.co/elasticsearch/elasticsearch:7.17.22",
|
||||
"environment": [
|
||||
"discovery.type=single-node",
|
||||
"xpack.security.enabled=false",
|
||||
"bootstrap.memory_lock=true",
|
||||
"ES_JAVA_OPTS=-Xms1g -Xmx1g"
|
||||
],
|
||||
"ulimits": {
|
||||
"memlock": {
|
||||
"soft": -1,
|
||||
"hard": -1
|
||||
}
|
||||
},
|
||||
"volumes": [
|
||||
"/path/to/esdata:/usr/share/elasticsearch/data"
|
||||
],
|
||||
"ports": [
|
||||
"9200:9200"
|
||||
],
|
||||
"depends_on": [
|
||||
"elasticsearch-helper"
|
||||
],
|
||||
"restart": "unless-stopped"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "diskover",
|
||||
"image": "lscr.io/linuxserver/diskover:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [
|
||||
"elasticsearch"
|
||||
],
|
||||
"frontend_network": true,
|
||||
"private_network": true,
|
||||
"compose": {
|
||||
"image": "lscr.io/linuxserver/diskover",
|
||||
"container_name": "diskover",
|
||||
"environment": [
|
||||
"PUID=1000",
|
||||
"PGID=1000",
|
||||
"TZ=America/New_York",
|
||||
"ES_HOST=elasticsearch",
|
||||
"ES_PORT=9200"
|
||||
],
|
||||
"volumes": [
|
||||
"/path/to/diskover/config:/config",
|
||||
"/path/to/diskover/data:/data"
|
||||
],
|
||||
"ports": [
|
||||
"80:80"
|
||||
],
|
||||
"mem_limit": "4096m",
|
||||
"restart": "unless-stopped",
|
||||
"depends_on": [
|
||||
"elasticsearch"
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"version": "2"
|
||||
},
|
||||
"networking": {
|
||||
"frontend": "selected-proxmox-bridge",
|
||||
"private_required": true,
|
||||
"private_creation": "automatic-create-if-missing",
|
||||
"private_address_allocation": "automatic-static-address-per-service",
|
||||
"service_discovery": "private-addresses-with-compose-service-host-aliases",
|
||||
"dependency_external_access": "disabled-unless-service-publishes-ports",
|
||||
"prompt_user_for_private_network": false
|
||||
},
|
||||
"storage": [
|
||||
{
|
||||
"id": "diskover-volume-0",
|
||||
"service": "diskover",
|
||||
"container_path": "/config",
|
||||
"mode": "managed-volume",
|
||||
"user_selectable": false,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"source_path": null,
|
||||
"source_path_prompt": null
|
||||
},
|
||||
{
|
||||
"id": "diskover-volume-1",
|
||||
"service": "diskover",
|
||||
"container_path": "/data",
|
||||
"mode": "host-bind",
|
||||
"user_selectable": true,
|
||||
"backup": false,
|
||||
"shared_with_other_lxc": true,
|
||||
"source_path": null,
|
||||
"source_path_prompt": "Host directory for diskover:/data"
|
||||
},
|
||||
{
|
||||
"id": "elasticsearch-volume-0",
|
||||
"service": "elasticsearch",
|
||||
"container_path": "/usr/share/elasticsearch/data",
|
||||
"mode": "managed-volume",
|
||||
"user_selectable": false,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"source_path": null,
|
||||
"source_path_prompt": null
|
||||
}
|
||||
],
|
||||
"orchestration": {
|
||||
"reserve_vmids_atomically": 3,
|
||||
"start_order": [
|
||||
"elasticsearch-helper",
|
||||
"elasticsearch",
|
||||
"diskover"
|
||||
],
|
||||
"stop_order": [
|
||||
"diskover",
|
||||
"elasticsearch",
|
||||
"elasticsearch-helper"
|
||||
],
|
||||
"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": []
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,328 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-docker-volume-backup",
|
||||
"status": "generated-review-required",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Docker Volume Backup"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Docker Volume Backup"
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Requires real Docker daemon/socket and Docker Compose stacks; cannot back up native Proxmox OCI instances as Docker volumes. Hidden pending explicit external Docker integration; no Docker installed on Proxmox."
|
||||
},
|
||||
"category": "tools",
|
||||
"category_label": "Tools",
|
||||
"author": "mrcaringi",
|
||||
"developer": "mrcaringi",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": null,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://github.com/MrCaringi/docker-volume-backup",
|
||||
"documentation": "https://github.com/MrCaringi/docker-volume-backup",
|
||||
"repository": "https://github.com/MrCaringi/docker-volume-backup",
|
||||
"tips": [
|
||||
"Requires real Docker daemon/socket and Docker Compose stacks; cannot back up native Proxmox OCI instances as Docker volumes. Hidden pending explicit external Docker integration; no Docker installed on Proxmox."
|
||||
],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-09-16",
|
||||
"hidden": true,
|
||||
"hidden_reason": "Requires a real Docker daemon and Compose stacks; native OCI instances are not Docker volumes."
|
||||
},
|
||||
"source": {
|
||||
"provider": "mrcaringi",
|
||||
"repository": "https://github.com/MrCaringi/docker-volume-backup",
|
||||
"default_branch": "main",
|
||||
"revision": "a12dbb8770687a5f8127fe9843e83755d3addbb6",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/MrCaringi/docker-volume-backup/a12dbb8770687a5f8127fe9843e83755d3addbb6/README.md",
|
||||
"image_repository_url": "https://hub.docker.com/r/mrcaringi/docker-volume-backup",
|
||||
"compose_sha256": "28758bdfd464f5d2ae5ae88ed334f2b6fe842642ca189548086f0c64a76882ef",
|
||||
"generated_at": "2026-09-16T22:00:00+02:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "docker-volume-backup",
|
||||
"container_name": "docker-volume-backup",
|
||||
"image": {
|
||||
"reference": "mrcaringi/docker-volume-backup:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "mrcaringi/docker-volume-backup",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "CRON_SCHEDULE",
|
||||
"example": "0 2 * * *",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "upstream-documentation",
|
||||
"prompt_user": true
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Europe/Madrid",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "upstream-documentation",
|
||||
"prompt_user": true
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "config",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "config-data",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 4
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "backups",
|
||||
"container_path": "/backup",
|
||||
"compose_source_example": "/mnt/oci-shared/backups",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "host-bind",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 32
|
||||
}
|
||||
}
|
||||
],
|
||||
"ports": [],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "# docker-compose.yml\nservices:\n container-backups:\n image: mrcaringi/docker-volume-backup:latest\n container_name: container-backups\n hostname: myserver # shown in Telegram notifications\n restart: always\n environment:\n CRON_SCHEDULE: \"0 2 * * *\"\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n - ./config.json:/config/config.json:ro\n - /path/to/backups:/backup\n # Mount stack directories at the same path used in config.json\n - /home/user/docker/stacks:/home/user/docker/stacks:ro\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "mkvtoolnix",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "mkvtoolnix",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "mkvtoolnix",
|
||||
"image": "jlesage/mkvtoolnix:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"image": "jlesage/mkvtoolnix:latest",
|
||||
"ports": [
|
||||
"5800:5800"
|
||||
],
|
||||
"environment": {
|
||||
"USER_ID": "1000",
|
||||
"GROUP_ID": "1000",
|
||||
"TZ": "Europe/Madrid"
|
||||
},
|
||||
"volumes": [
|
||||
"mkvtoolnix-config:/config",
|
||||
"/mnt/oci-shared/media:/storage"
|
||||
],
|
||||
"restart": "unless-stopped"
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {},
|
||||
"networking": {
|
||||
"frontend": "selected-proxmox-bridge",
|
||||
"private_required": false,
|
||||
"private_creation": "not-required",
|
||||
"private_address_allocation": "not-required",
|
||||
"service_discovery": "dedicated-lxc-address",
|
||||
"dependency_external_access": "not-applicable",
|
||||
"prompt_user_for_private_network": false
|
||||
},
|
||||
"storage": [
|
||||
{
|
||||
"id": "mkvtoolnix-config",
|
||||
"service": "mkvtoolnix",
|
||||
"container_path": "/config",
|
||||
"mode": "user-selectable",
|
||||
"user_selectable": true,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"default": "managed-volume",
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "mkvtoolnix-storage",
|
||||
"service": "mkvtoolnix",
|
||||
"container_path": "/storage",
|
||||
"mode": "user-selectable",
|
||||
"user_selectable": true,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": true,
|
||||
"default": "host-bind",
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
]
|
||||
}
|
||||
],
|
||||
"orchestration": {
|
||||
"reserve_vmids_atomically": 1,
|
||||
"start_order": [
|
||||
"mkvtoolnix"
|
||||
],
|
||||
"stop_order": [
|
||||
"mkvtoolnix"
|
||||
],
|
||||
"dependency_readiness": "mandatory-http-first-start-healthcheck",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-external-host-data"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"image_digest_resolution",
|
||||
"managed_volume_preparation"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"proxmox": {
|
||||
"runtime": "native-oci-lxc",
|
||||
"technology_status": "proxmox-technology-preview",
|
||||
"catalog": {
|
||||
"replaces_discovered_ids": []
|
||||
},
|
||||
"defaults": {
|
||||
"unprivileged": true,
|
||||
"ostype": "auto-from-image",
|
||||
"cores": 2,
|
||||
"memory_mb": 2048,
|
||||
"swap_mb": 512,
|
||||
"rootfs_size_gb": 8,
|
||||
"rootfs_storage": "local-lvm",
|
||||
"volume_storage": "local-lvm",
|
||||
"template_storage": "local",
|
||||
"bridge": "vmbr0",
|
||||
"ipv4": "dhcp",
|
||||
"firewall": true,
|
||||
"host_managed_network": true,
|
||||
"onboot": false,
|
||||
"features": [
|
||||
"nesting=1"
|
||||
],
|
||||
"shutdown_timeout_seconds": 30
|
||||
},
|
||||
"image_metadata_policy": {
|
||||
"entrypoint": "import-from-oci-image",
|
||||
"cmd": "import-from-oci-image",
|
||||
"environment": "import-image-env-then-apply-compose-overrides",
|
||||
"user": "import-from-oci-image",
|
||||
"working_dir": "import-from-oci-image",
|
||||
"stop_signal": "import-from-oci-image"
|
||||
},
|
||||
"adaptations": [
|
||||
{
|
||||
"id": "native-persistent-volumes",
|
||||
"upstream_behavior": "Docker bind mounts persistent directories into the image.",
|
||||
"native_lxc_behavior": "ProxMenux attaches native Proxmox volumes or explicit host bind mounts at the same container paths.",
|
||||
"reason": "Preserve the official image contract while making persistence visible to Proxmox backup policy.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-clean-install"
|
||||
},
|
||||
{
|
||||
"id": "native-device-passthrough",
|
||||
"upstream_behavior": "Docker exposes explicitly selected host devices to the container.",
|
||||
"native_lxc_behavior": "ProxMenux maps each selected device with the native Proxmox dev resource.",
|
||||
"reason": "The OCI process runs directly inside an LXC rather than through Docker.",
|
||||
"behavioral_impact": "Only devices explicitly selected by the user are exposed.",
|
||||
"validation": "not-required"
|
||||
}
|
||||
],
|
||||
"installer_profile": {},
|
||||
"security_profile": {
|
||||
"requires_privileged_lxc": false,
|
||||
"source_requests_privileged_lxc": false,
|
||||
"optional_privileged_lxc": false,
|
||||
"requires_host_pid_namespace": false,
|
||||
"source_requests_relaxed_confinement": false,
|
||||
"requires_relaxed_confinement": false,
|
||||
"optional_relaxed_confinement": false,
|
||||
"risk_level": "normal",
|
||||
"confirmation_required": false,
|
||||
"warning": "No security relaxation is required for the reviewed profile."
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": false,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"devices",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [
|
||||
"docker-engine-required-no-native-oci-stack-support"
|
||||
],
|
||||
"policy": "Requires real Docker daemon/socket and Docker Compose stacks; cannot back up native Proxmox OCI instances as Docker volumes. Hidden pending explicit external Docker integration; no Docker installed on Proxmox."
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [],
|
||||
"credentials": []
|
||||
},
|
||||
"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-readme-revision-and-resolved-latest-image-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,588 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-docmost",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Docmost"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "A modern wiki and knowledge base for teams"
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Docmost is a self-hosted collaborative wiki and documentation tool designed for real-time collaboration, allowing multiple users to edit the same page simultaneously without conflicts. Its intuitive interface is ideal for teams managing knowledge bases, project documentation, or wikis, offering an efficient knowledge creation and sharing experience.\n\nThe tool's core features include real-time collaborative editing and space organization. It supports multiple users editing pages in real time for seamless collaboration and organizes pages into 'spaces' for teams, projects, or departments, each with independent permission settings. A rich text editor with Markdown shortcuts simplifies content creation. Built-in Draw.io, Excalidraw, and Mermaid tools provide robust diagramming capabilities.\n\nIt offers permissions management, assigning access via user groups for content security. Pages can be publicly shared via links for external access. Comments enhance communication and feedback, while page history tracks changes. Features like nested navigation, quick search, file attachments, and Markdown/HTML import/export are supported. The tool\u2019s collaboration and flexibility deliver a modern documentation solution.\n\n**Key Features:**\n- Real-time collaborative editing for multiple users\n- Spaces for organizing pages by team, project or department\n- Permissions management with user group access control\n- Rich text editor with Markdown shortcuts\n- Built-in Draw.io, Excalidraw, Mermaid diagramming tools\n- Public page sharing via links\n- Page comments for communication and feedback\n- Page history, nested navigation, search, and file attachments\n\n**Learn More:**\n- [Docmost Official Website](https://docmost.com/)\n- [Docmost GitHub](https://github.com/docmost/docmost)\n"
|
||||
},
|
||||
"category": "documents",
|
||||
"category_label": "Documents & Notes",
|
||||
"author": "docmost",
|
||||
"developer": "docmost",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 3000,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://docmost.com/",
|
||||
"documentation": null,
|
||||
"repository": "https://hub.docker.com/r/docmost/docmost",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "official",
|
||||
"repository": "https://hub.docker.com/r/docmost/docmost",
|
||||
"revision": "39d7992c1d6384964082d60c9ffe8891d6eca6003cc7fc31ec3e8cc63fa27f32",
|
||||
"image_repository_url": "https://hub.docker.com/r/docmost/docmost",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "39d7992c1d6384964082d60c9ffe8891d6eca6003cc7fc31ec3e8cc63fa27f32",
|
||||
"generated_at": "2026-09-13T15:48:25+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "docmost",
|
||||
"container_name": "docmost",
|
||||
"image": {
|
||||
"reference": "docmost/docmost:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "docmost/docmost",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "APP_URL",
|
||||
"example": "http://localhost:3000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "APP_SECRET",
|
||||
"example": "${GENERATED_APP_SECRET}",
|
||||
"required": true,
|
||||
"sensitive": true,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "DATABASE_URL",
|
||||
"example": "postgresql://docmost:jcui51lw747yuuk4zrpm@docmost-db:5432/docmost?schema=public",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "REDIS_URL",
|
||||
"example": "redis://docmost-redis:6379",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/app/data/storage",
|
||||
"compose_source_example": "/DATA/AppData/$AppID/storage",
|
||||
"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": 3000,
|
||||
"published_example": 3000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [
|
||||
{
|
||||
"name": "docmost-db",
|
||||
"image": "postgres:latest"
|
||||
},
|
||||
{
|
||||
"name": "docmost-redis",
|
||||
"image": "redis:latest"
|
||||
}
|
||||
],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "name: docmost\nservices:\n docmost:\n image: docmost/docmost:latest\n container_name: docmost\n deploy:\n resources:\n reservations:\n memory: 512M\n restart: unless-stopped\n ports:\n - target: 3000\n published: '3000'\n protocol: tcp\n volumes:\n - type: bind\n source: /DATA/AppData/$AppID/storage\n target: /app/data/storage\n environment:\n APP_URL: http://localhost:3000\n APP_SECRET: ${GENERATED_APP_SECRET}\n DATABASE_URL: postgresql://docmost:jcui51lw747yuuk4zrpm@docmost-db:5432/docmost?schema=public\n REDIS_URL: redis://docmost-redis:6379\n networks:\n - docmost-network\n depends_on:\n - docmost-db\n - docmost-redis\n docmost-db:\n container_name: docmost-db\n image: postgres:latest\n environment:\n POSTGRES_DB: docmost\n POSTGRES_USER: docmost\n POSTGRES_PASSWORD: ${GENERATED_POSTGRES_PASSWORD}\n restart: unless-stopped\n volumes:\n - type: bind\n source: /DATA/AppData/$AppID/pgdata\n target: /var/lib/postgresql/data\n networks:\n - docmost-network\n docmost-redis:\n container_name: docmost-redis\n image: redis:latest\n restart: unless-stopped\n volumes:\n - type: bind\n source: /DATA/AppData/$AppID/redis\n target: /data\n networks:\n - docmost-network\nnetworks:\n docmost-network:\n driver: bridge\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "docmost",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "docmost",
|
||||
"service_count": 3,
|
||||
"services": [
|
||||
{
|
||||
"name": "docmost-db",
|
||||
"image": "postgres:latest",
|
||||
"is_main": false,
|
||||
"role": "dependency",
|
||||
"vmid_offset": 1,
|
||||
"depends_on": [],
|
||||
"frontend_network": false,
|
||||
"private_network": true,
|
||||
"compose": {
|
||||
"container_name": "docmost-db",
|
||||
"image": "postgres:latest",
|
||||
"environment": {
|
||||
"POSTGRES_DB": "docmost",
|
||||
"POSTGRES_USER": "docmost",
|
||||
"POSTGRES_PASSWORD": "${GENERATED_POSTGRES_PASSWORD}"
|
||||
},
|
||||
"restart": "unless-stopped",
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/pgdata",
|
||||
"target": "/var/lib/postgresql/data"
|
||||
}
|
||||
],
|
||||
"networks": [
|
||||
"docmost-network"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "docmost-redis",
|
||||
"image": "redis:latest",
|
||||
"is_main": false,
|
||||
"role": "dependency",
|
||||
"vmid_offset": 2,
|
||||
"depends_on": [],
|
||||
"frontend_network": false,
|
||||
"private_network": true,
|
||||
"compose": {
|
||||
"container_name": "docmost-redis",
|
||||
"image": "redis:latest",
|
||||
"restart": "unless-stopped",
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/redis",
|
||||
"target": "/data"
|
||||
}
|
||||
],
|
||||
"networks": [
|
||||
"docmost-network"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "docmost",
|
||||
"image": "docmost/docmost:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [
|
||||
"docmost-db",
|
||||
"docmost-redis"
|
||||
],
|
||||
"frontend_network": true,
|
||||
"private_network": true,
|
||||
"compose": {
|
||||
"image": "docmost/docmost:latest",
|
||||
"container_name": "docmost",
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "512M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"restart": "unless-stopped",
|
||||
"ports": [
|
||||
{
|
||||
"target": 3000,
|
||||
"published": "3000",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/storage",
|
||||
"target": "/app/data/storage"
|
||||
}
|
||||
],
|
||||
"environment": {
|
||||
"APP_URL": "http://localhost:3000",
|
||||
"APP_SECRET": "${GENERATED_APP_SECRET}",
|
||||
"DATABASE_URL": "postgresql://docmost:jcui51lw747yuuk4zrpm@docmost-db:5432/docmost?schema=public",
|
||||
"REDIS_URL": "redis://docmost-redis:6379"
|
||||
},
|
||||
"networks": [
|
||||
"docmost-network"
|
||||
],
|
||||
"depends_on": [
|
||||
"docmost-db",
|
||||
"docmost-redis"
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "docmost",
|
||||
"networks": {
|
||||
"docmost-network": {
|
||||
"driver": "bridge"
|
||||
}
|
||||
}
|
||||
},
|
||||
"networking": {
|
||||
"frontend": "selected-proxmox-bridge",
|
||||
"private_required": true,
|
||||
"private_creation": "automatic-create-if-missing",
|
||||
"private_address_allocation": "automatic-static-address-per-service",
|
||||
"service_discovery": "private-addresses-with-compose-service-host-aliases",
|
||||
"dependency_external_access": "disabled-unless-service-publishes-ports",
|
||||
"prompt_user_for_private_network": false
|
||||
},
|
||||
"storage": [
|
||||
{
|
||||
"id": "docmost-volume-0",
|
||||
"service": "docmost",
|
||||
"container_path": "/app/data/storage",
|
||||
"mode": "managed-volume",
|
||||
"user_selectable": false,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"source_path": null,
|
||||
"source_path_prompt": null
|
||||
},
|
||||
{
|
||||
"id": "docmost-db-volume-0",
|
||||
"service": "docmost-db",
|
||||
"container_path": "/var/lib/postgresql/data",
|
||||
"mode": "managed-volume",
|
||||
"user_selectable": false,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"source_path": null,
|
||||
"source_path_prompt": null
|
||||
},
|
||||
{
|
||||
"id": "docmost-redis-volume-0",
|
||||
"service": "docmost-redis",
|
||||
"container_path": "/data",
|
||||
"mode": "host-bind",
|
||||
"user_selectable": true,
|
||||
"backup": false,
|
||||
"shared_with_other_lxc": true,
|
||||
"source_path": null,
|
||||
"source_path_prompt": "Host directory for docmost-redis:/data"
|
||||
}
|
||||
],
|
||||
"orchestration": {
|
||||
"reserve_vmids_atomically": 3,
|
||||
"start_order": [
|
||||
"docmost-db",
|
||||
"docmost-redis",
|
||||
"docmost"
|
||||
],
|
||||
"stop_order": [
|
||||
"docmost",
|
||||
"docmost-redis",
|
||||
"docmost-db"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": [
|
||||
{
|
||||
"id": "app-secret",
|
||||
"strategy": "generate-cryptographically-random-at-install",
|
||||
"bindings": [
|
||||
{
|
||||
"service": "docmost",
|
||||
"environment_variable": "APP_SECRET"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "postgres-password",
|
||||
"strategy": "generate-cryptographically-random-at-install",
|
||||
"bindings": [
|
||||
{
|
||||
"service": "docmost-db",
|
||||
"environment_variable": "POSTGRES_PASSWORD"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 3000,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"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": 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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"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": {
|
||||
"stack_driver": "generic-multi-lxc-stack"
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"cap_add",
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"sysctls",
|
||||
"tty",
|
||||
"user",
|
||||
"volumes",
|
||||
"working_dir"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "Single-image definitions are installable when every declared Compose option has a native Proxmox translation. Multi-image and unsupported runtime features remain blocked until their orchestrator or mapping is available."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "resolve-latest-image-then-apply-reviewed-native-lxc-update",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-compose-sha256-and-resolved-latest-image-digest",
|
||||
"automatic_unattended_updates": false,
|
||||
"dependency_lifecycle": {
|
||||
"implementation": "proxmox-hookscript",
|
||||
"trigger": "main-lxc-pre-start",
|
||||
"waits_for_dependency_healthchecks": true,
|
||||
"stops_dependencies_with_main": false
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,268 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-dogwalk",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Dogwalk"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "DOGWALK is Blender Studio's long awaited second game project, focused on creating a bite-sized interactive storytelling playground. Play as a big adorable dog and explore the winter woods with a little kid."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "DOGWALK is Blender Studio's long awaited second game project, focused on creating a bite-sized interactive storytelling playground. Play as a big adorable dog and explore the winter woods with a little kid."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/dogwalk-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/dogwalk-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://studio.blender.org/projects/dogwalk/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-dogwalk/",
|
||||
"repository": "https://github.com/linuxserver/docker-dogwalk",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-03-31",
|
||||
"note": "Make Wayland default disable with PIXELFLUX_WAYLAND=false."
|
||||
},
|
||||
{
|
||||
"date": "2025-12-28",
|
||||
"note": "Add Wayland init logic, rebase to Trixie, bump Dogwalk."
|
||||
},
|
||||
{
|
||||
"date": "2025-07-23",
|
||||
"note": "Bump DOGWALK to 1.0.2."
|
||||
},
|
||||
{
|
||||
"date": "2025-07-14",
|
||||
"note": "Initial release."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-03-31"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-dogwalk",
|
||||
"default_branch": "master",
|
||||
"revision": "84f77259d875c50e31f2b1a19aac8bb310cf7dc8",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-dogwalk/84f77259d875c50e31f2b1a19aac8bb310cf7dc8/README.md",
|
||||
"readme_pushed_at": "2026-09-06T01:03:22Z",
|
||||
"compose_sha256": "d87a4db3d9348df763f1362f417447c799e09e001ccb881c29f977428d298a34",
|
||||
"generated_at": "2026-09-12T14:37:25+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "dogwalk",
|
||||
"container_name": "dogwalk",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/dogwalk:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/dogwalk",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/dogwalk/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": 3000,
|
||||
"published_example": 3000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 3001,
|
||||
"published_example": 3001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n dogwalk:\n image: lscr.io/linuxserver/dogwalk:latest\n container_name: dogwalk\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/dogwalk/config:/config\n ports:\n - 3000:3000\n - 3001:3001\n shm_size: \"1gb\"\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
}
|
||||
],
|
||||
"installer_profile": {
|
||||
"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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"shm_size",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,248 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-dokuwiki",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Dokuwiki"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Dokuwiki is a simple to use and highly versatile Open Source wiki software that doesn't require a database. It is loved by users for its clean and readable syntax. The ease of maintenance, backup and integration makes it an administrator's favorite. Built in access controls and authentication connectors make DokuWiki especially useful in the enterprise context and the large number of plugins contributed by its vibrant community allow for a broad range of use cases beyond a traditional wiki."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Dokuwiki is a simple to use and highly versatile Open Source wiki software that doesn't require a database. It is loved by users for its clean and readable syntax. The ease of maintenance, backup and integration makes it an administrator's favorite. Built in access controls and authentication connectors make DokuWiki especially useful in the enterprise context and the large number of plugins contributed by its vibrant community allow for a broad range of use cases beyond a traditional wiki."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/dokuwiki-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/dokuwiki-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 80,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://www.dokuwiki.org/dokuwiki/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-dokuwiki/",
|
||||
"repository": "https://github.com/linuxserver/docker-dokuwiki",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-07-14",
|
||||
"note": "Rebase to Alpine 3.24, add php-tokenizer."
|
||||
},
|
||||
{
|
||||
"date": "2025-07-05",
|
||||
"note": "Rebase to Alpine 3.22."
|
||||
},
|
||||
{
|
||||
"date": "2025-05-10",
|
||||
"note": "Rebase to Alpine 3.21."
|
||||
},
|
||||
{
|
||||
"date": "2024-05-31",
|
||||
"note": "Rebase to Alpine 3.20. Existing users should update their nginx confs to avoid http2 deprecation warnings."
|
||||
},
|
||||
{
|
||||
"date": "2024-01-23",
|
||||
"note": "Rebase to Alpine 3.19 with php 8.3."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-07-14"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-dokuwiki",
|
||||
"default_branch": "master",
|
||||
"revision": "1b38892eb8ad265acaffa9baf4cd67f7f63f9cb2",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-dokuwiki/1b38892eb8ad265acaffa9baf4cd67f7f63f9cb2/README.md",
|
||||
"readme_pushed_at": "2026-09-11T18:58:18Z",
|
||||
"compose_sha256": "c84c826250cc01a307f3024f0a62e8a0687f1aace5c396b34e49729ef631c39e",
|
||||
"generated_at": "2026-09-12T14:37:25+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "dokuwiki",
|
||||
"container_name": "dokuwiki",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/dokuwiki:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/dokuwiki",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/dokuwiki/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": 80,
|
||||
"published_example": 80,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 443,
|
||||
"published_example": 443,
|
||||
"protocol": "tcp",
|
||||
"required": false,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n dokuwiki:\n image: lscr.io/linuxserver/dokuwiki:latest\n container_name: dokuwiki\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/dokuwiki/config:/config\n ports:\n - 80:80\n - 443:443 #optional\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 80,
|
||||
"path": "/",
|
||||
"source": "compose-first-tcp-port-fallback"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,272 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-dolphin",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Dolphin"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Dolphin Emulator lets you play GameCube and Wii games with various graphical enhancements and other features are available to improve your game experience."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Dolphin Emulator lets you play GameCube and Wii games with various graphical enhancements and other features are available to improve your game experience."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/dolphin-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/dolphin-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://dolphin-emu.org/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-dolphin/",
|
||||
"repository": "https://github.com/linuxserver/docker-dolphin",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-05-06",
|
||||
"note": "Build dolphin from source, ingest latest versions, remove aarch64 support."
|
||||
},
|
||||
{
|
||||
"date": "2026-03-05",
|
||||
"note": "Make Wayland default disable with PIXELFLUX_WAYLAND=false."
|
||||
},
|
||||
{
|
||||
"date": "2025-12-20",
|
||||
"note": "Add Wayland init logic."
|
||||
},
|
||||
{
|
||||
"date": "2025-08-15",
|
||||
"note": "Rebase to Debian Trixie for updated Dolphin, update controller mapping."
|
||||
},
|
||||
{
|
||||
"date": "2025-06-18",
|
||||
"note": "Initial Version."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-05-06"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-dolphin",
|
||||
"default_branch": "master",
|
||||
"revision": "98b20d38e8a96bfab595dc086e35971d3606aadb",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-dolphin/98b20d38e8a96bfab595dc086e35971d3606aadb/README.md",
|
||||
"readme_pushed_at": "2026-09-06T01:36:27Z",
|
||||
"compose_sha256": "ab90cd60f54056de4dcdd84b7b383583fc8cb91191bb3ea09f4ab5bf7d5e4126",
|
||||
"generated_at": "2026-09-12T14:37:25+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "dolphin",
|
||||
"container_name": "dolphin",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/dolphin:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/dolphin",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/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": 3000,
|
||||
"published_example": 3000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 3001,
|
||||
"published_example": 3001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n dolphin:\n image: lscr.io/linuxserver/dolphin:latest\n container_name: dolphin\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/config:/config\n ports:\n - 3000:3000\n - 3001:3001\n shm_size: \"1gb\"\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
}
|
||||
],
|
||||
"installer_profile": {
|
||||
"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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"shm_size",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,351 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-doplarr",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Deprecation Notice"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Doplarr is an *arr request bot for Discord.\""
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Doplarr is an *arr request bot for Discord.\""
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/doplarr-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/doplarr-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": null,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://github.com/kiranshila/Doplarr",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-doplarr/",
|
||||
"repository": "https://github.com/linuxserver/docker-doplarr",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2025-07-27",
|
||||
"note": "Rebase to Alpine 3.22."
|
||||
},
|
||||
{
|
||||
"date": "2025-01-27",
|
||||
"note": "Rebase to Alpine 3.21."
|
||||
},
|
||||
{
|
||||
"date": "2024-06-24",
|
||||
"note": "Rebase to Alpine 3.20."
|
||||
},
|
||||
{
|
||||
"date": "2023-12-23",
|
||||
"note": "Rebase to Alpine 3.19."
|
||||
},
|
||||
{
|
||||
"date": "2023-05-25",
|
||||
"note": "Rebase to Alpine 3.18."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2025-07-27"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-doplarr",
|
||||
"default_branch": "main",
|
||||
"revision": "0ae050b6510a9e305207089fc3c11e5290700acd",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-doplarr/0ae050b6510a9e305207089fc3c11e5290700acd/README.md",
|
||||
"readme_pushed_at": "2026-07-09T23:30:33Z",
|
||||
"compose_sha256": "12bed6c74e6999994f0266804a2fbe76b3d511dcbdc881e32dd630a123611778",
|
||||
"generated_at": "2026-09-12T14:37:26+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "doplarr",
|
||||
"container_name": "doplarr",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/doplarr:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/doplarr",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "DISCORD__TOKEN",
|
||||
"example": "",
|
||||
"required": true,
|
||||
"sensitive": true,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "OVERSEERR__API",
|
||||
"example": "",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "OVERSEERR__URL",
|
||||
"example": "http://localhost:5055",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "RADARR__API",
|
||||
"example": "",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "RADARR__URL",
|
||||
"example": "http://localhost:7878",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "SONARR__API",
|
||||
"example": "",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "SONARR__URL",
|
||||
"example": "http://localhost:8989",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "DISCORD__MAX_RESULTS",
|
||||
"example": "25",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "DISCORD__REQUESTED_MSG_STYLE",
|
||||
"example": ":plain",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "SONARR__QUALITY_PROFILE",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "RADARR__QUALITY_PROFILE",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "SONARR__ROOTFOLDER",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "RADARR__ROOTFOLDER",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "SONARR__LANGUAGE_PROFILE",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "OVERSEERR__DEFAULT_ID",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PARTIAL_SEASONS",
|
||||
"example": "true",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "LOG_LEVEL",
|
||||
"example": ":info",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "JAVA_OPTS",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/doplarr/config",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 4
|
||||
}
|
||||
}
|
||||
],
|
||||
"ports": [],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n doplarr:\n image: lscr.io/linuxserver/doplarr:latest\n container_name: doplarr\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n - DISCORD__TOKEN=\n - OVERSEERR__API=\n - OVERSEERR__URL=http://localhost:5055\n - RADARR__API=\n - RADARR__URL=http://localhost:7878\n - SONARR__API=\n - SONARR__URL=http://localhost:8989\n - DISCORD__MAX_RESULTS=25 #optional\n - DISCORD__REQUESTED_MSG_STYLE=:plain #optional\n - SONARR__QUALITY_PROFILE= #optional\n - RADARR__QUALITY_PROFILE= #optional\n - SONARR__ROOTFOLDER= #optional\n - RADARR__ROOTFOLDER= #optional\n - SONARR__LANGUAGE_PROFILE= #optional\n - OVERSEERR__DEFAULT_ID= #optional\n - PARTIAL_SEASONS=true #optional\n - LOG_LEVEL=:info #optional\n - JAVA_OPTS= #optional\n volumes:\n - /path/to/doplarr/config:/config\n restart: unless-stopped\n"
|
||||
},
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,209 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-doplarr-rs",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Doplarr_Rs"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Doplarr_rs is a Discord bot for requesting media through *arr backends, written in Rust."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Doplarr_rs is a Discord bot for requesting media through *arr backends, written in Rust."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/doplarr_rs-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/doplarr_rs-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": null,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://github.com/activexray/doplarr_rs",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-doplarr_rs/",
|
||||
"repository": "https://github.com/linuxserver/docker-doplarr_rs",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-06-22",
|
||||
"note": "Initial Release."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-06-22"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-doplarr_rs",
|
||||
"default_branch": "main",
|
||||
"revision": "cdbc28479471da2c653feeb549341d1a0f518d07",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-doplarr_rs/cdbc28479471da2c653feeb549341d1a0f518d07/README.md",
|
||||
"readme_pushed_at": "2026-09-10T18:29:06Z",
|
||||
"compose_sha256": "1ddaa7250b2fd7e656df299b62cdc3b8e806b283482f9537780f596fc64ddfb9",
|
||||
"generated_at": "2026-09-12T14:37:25+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "doplarr_rs",
|
||||
"container_name": "doplarr_rs",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/doplarr_rs:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/doplarr_rs",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/doplarr_rs/config",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 4
|
||||
}
|
||||
}
|
||||
],
|
||||
"ports": [],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n doplarr_rs:\n image: lscr.io/linuxserver/doplarr_rs:latest\n container_name: doplarr_rs\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/doplarr_rs/config:/config\n restart: unless-stopped\n"
|
||||
},
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,264 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-dosbox-staging",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Dosbox Staging"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "DOSBox Staging is a modern continuation of DOSBox a free and open-source emulator that enables the execution of MS-DOS software, especially video games."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "DOSBox Staging is a modern continuation of DOSBox a free and open-source emulator that enables the execution of MS-DOS software, especially video games."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/dosbox-staging-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/dosbox-staging-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://www.dosbox-staging.org/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-dosbox-staging/",
|
||||
"repository": "https://github.com/linuxserver/docker-dosbox-staging",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-03-05",
|
||||
"note": "Make Wayland default disable with PIXELFLUX_WAYLAND=false."
|
||||
},
|
||||
{
|
||||
"date": "2025-12-28",
|
||||
"note": "Add Wayland init logic."
|
||||
},
|
||||
{
|
||||
"date": "2025-08-30",
|
||||
"note": "Initial release."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-03-05"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-dosbox-staging",
|
||||
"default_branch": "master",
|
||||
"revision": "051745936f752276132374cbea348577fc572b7d",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-dosbox-staging/051745936f752276132374cbea348577fc572b7d/README.md",
|
||||
"readme_pushed_at": "2026-09-11T15:02:25Z",
|
||||
"compose_sha256": "faa6b73ceccc05b99ec1be478730ae63b745d57c0e484c950dab7568637ef83d",
|
||||
"generated_at": "2026-09-12T14:37:26+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "dosbox-staging",
|
||||
"container_name": "dosbox-staging",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/dosbox-staging:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/dosbox-staging",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/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": 3000,
|
||||
"published_example": 3000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 3001,
|
||||
"published_example": 3001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n dosbox-staging:\n image: lscr.io/linuxserver/dosbox-staging:latest\n container_name: dosbox-staging\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/config:/config\n ports:\n - 3000:3000\n - 3001:3001\n shm_size: \"1gb\"\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
}
|
||||
],
|
||||
"installer_profile": {
|
||||
"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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"shm_size",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,389 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-doublecommander",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Doublecommander"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Double Commander is a free cross platform open source file manager with two panels side by side. It is inspired by Total Commander and features some new ideas."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Double Commander is a free cross platform open source file manager with two panels side by side. It is inspired by Total Commander and features some new ideas."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/doublecommander-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/doublecommander-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://doublecmd.sourceforge.io/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-doublecommander/",
|
||||
"repository": "https://github.com/linuxserver/docker-doublecommander",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-04-03",
|
||||
"note": "Make Wayland default disable with PIXELFLUX_WAYLAND=false."
|
||||
},
|
||||
{
|
||||
"date": "2025-12-28",
|
||||
"note": "Add Wayland init logic."
|
||||
},
|
||||
{
|
||||
"date": "2025-09-22",
|
||||
"note": "Rebase to Debian Trixie."
|
||||
},
|
||||
{
|
||||
"date": "2025-07-28",
|
||||
"note": "Fix CPU usage bug by disabling fake udev."
|
||||
},
|
||||
{
|
||||
"date": "2025-07-12",
|
||||
"note": "Rebase to Selkies, HTTPS IS NOW REQUIRED."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-04-03"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-doublecommander",
|
||||
"default_branch": "master",
|
||||
"revision": "269b0d47b74e8ecb24cbafd655929aba24f228ea",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-doublecommander/269b0d47b74e8ecb24cbafd655929aba24f228ea/README.md",
|
||||
"readme_pushed_at": "2026-09-09T21:59:22Z",
|
||||
"compose_sha256": "eeee5613cda05a1dadafb70a55194e3d03e5e840f1303ec7305d496d9cca4103",
|
||||
"generated_at": "2026-09-12T14:37:26+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "doublecommander",
|
||||
"container_name": "doublecommander",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/doublecommander:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/doublecommander",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "LC_ALL",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "upstream-documentation",
|
||||
"prompt": "Language/locale (e.g. es_ES.UTF-8; translation of every application is not guaranteed)"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/config",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 4
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-1",
|
||||
"container_path": "/data",
|
||||
"compose_source_example": "/path/to/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": 3000,
|
||||
"published_example": 3000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 3001,
|
||||
"published_example": 3001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n doublecommander:\n image: lscr.io/linuxserver/doublecommander:latest\n container_name: doublecommander\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/config:/config\n - /path/to/data:/data\n ports:\n - 3000:3000\n - 3001:3001\n shm_size: \"1gb\"\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
}
|
||||
],
|
||||
"installer_profile": {
|
||||
"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"
|
||||
]
|
||||
},
|
||||
{
|
||||
"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"
|
||||
]
|
||||
}
|
||||
],
|
||||
"selkies": {
|
||||
"base": "FROM ghcr.io/linuxserver/baseimage-selkies:debiantrixie",
|
||||
"dockerfile_url": "https://raw.githubusercontent.com/linuxserver/docker-doublecommander/master/Dockerfile",
|
||||
"dockerfile_sha256": "6f679c5f1b33a4459369165c23f0fa12d3f97b8c9bf6336d46d805539a49a4e7",
|
||||
"reviewed_on": "2026-09-16",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/",
|
||||
"nvidia": "not-offered-until-specific-host-and-image-validation",
|
||||
"validation": "profile-generated; real streaming workload pending"
|
||||
},
|
||||
"optional_devices": [],
|
||||
"hardware_acceleration": {
|
||||
"prompt": "Selkies desktop and streaming acceleration",
|
||||
"default": "none",
|
||||
"profiles": [
|
||||
{
|
||||
"id": "none",
|
||||
"label": "No GPU (CPU)",
|
||||
"device_requests": [],
|
||||
"environment": [
|
||||
{
|
||||
"name": "AUTO_GPU",
|
||||
"value": "false"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "vaapi",
|
||||
"label": "Intel/AMD (streaming rendering and encoding)",
|
||||
"device_requests": [
|
||||
{
|
||||
"id": "selkies-render",
|
||||
"kind": "character-device",
|
||||
"path_prompt": "Intel/AMD render node",
|
||||
"host_path_default": "/dev/dri/renderD128",
|
||||
"container_path_strategy": "same-as-host",
|
||||
"mode": "0660",
|
||||
"deny_write": false,
|
||||
"gid_strategy": "host-device-gid",
|
||||
"drm_vendor_ids": [
|
||||
"0x8086",
|
||||
"0x1002"
|
||||
]
|
||||
}
|
||||
],
|
||||
"environment": [
|
||||
{
|
||||
"name": "PIXELFLUX_WAYLAND",
|
||||
"value": "true"
|
||||
},
|
||||
{
|
||||
"name": "AUTO_GPU",
|
||||
"value": "false"
|
||||
}
|
||||
],
|
||||
"environment_from_devices": {
|
||||
"DRINODE": [
|
||||
"selkies-render"
|
||||
],
|
||||
"DRI_NODE": [
|
||||
"selkies-render"
|
||||
],
|
||||
"ATTACHED_DEVICES_PERMS": [
|
||||
"selkies-render"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"gpu_validation": {
|
||||
"device_inventory": "host-sysfs-and-stat",
|
||||
"application_acceleration": "requires-workload-test",
|
||||
"tone_mapping": "not-implied-by-device-access"
|
||||
},
|
||||
"device_permissions": {
|
||||
"strategy": "linuxserver-native-init",
|
||||
"service_user": "abc",
|
||||
"environment": "ATTACHED_DEVICES_PERMS",
|
||||
"paths": "all-resolved-selected-character-devices"
|
||||
}
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"shm_size",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,459 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-downtify",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Downtify"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Download Spotify music with album art and metadata"
|
||||
},
|
||||
"description": {
|
||||
"en_US": "With Downtify you can download Spotify musics containing album art, track names, album title and other metadata about the songs. Just copy the Spotify link, whether it's a single song, an album, etc. As soon as your downloads are complete you will be notified!\n"
|
||||
},
|
||||
"category": "media",
|
||||
"category_label": "Media & Streaming",
|
||||
"author": "Henrique Sebasti\u00e3o",
|
||||
"developer": "Henrique Sebasti\u00e3o",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 8000,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://downtify.henriquesebastiao.com",
|
||||
"documentation": null,
|
||||
"repository": "https://ghcr.io/henriquesebastiao/downtify",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "henriquesebastiao",
|
||||
"repository": "https://ghcr.io/henriquesebastiao/downtify",
|
||||
"revision": "6bebd2e1e6c3ef3531e828bfc0ed887d131c1e4be3b8b33f3f6ef8fe04b8f24c",
|
||||
"image_repository_url": "https://ghcr.io/henriquesebastiao/downtify",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "6bebd2e1e6c3ef3531e828bfc0ed887d131c1e4be3b8b33f3f6ef8fe04b8f24c",
|
||||
"generated_at": "2026-09-13T15:34:58+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "downtify",
|
||||
"container_name": "downtify",
|
||||
"image": {
|
||||
"reference": "ghcr.io/henriquesebastiao/downtify:latest",
|
||||
"registry": "ghcr.io",
|
||||
"repository": "ghcr.io/henriquesebastiao/downtify",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "$PGID",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "$PUID",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "$TZ",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/downloads",
|
||||
"compose_source_example": "/DATA/Downloads/downtify",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-1",
|
||||
"container_path": "/data",
|
||||
"compose_source_example": "/DATA/AppData/$AppID/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": 8000,
|
||||
"published_example": 8582,
|
||||
"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: downtify\nservices:\n downtify:\n environment:\n PGID: $PGID\n PUID: $PUID\n TZ: $TZ\n image: ghcr.io/henriquesebastiao/downtify:latest\n deploy:\n resources:\n reservations:\n memory: 2048M\n ports:\n - target: 8000\n published: '8582'\n protocol: tcp\n restart: unless-stopped\n volumes:\n - type: bind\n source: /DATA/Downloads/downtify\n target: /downloads\n - type: bind\n source: /DATA/AppData/$AppID/data\n target: /data\n container_name: downtify\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "downtify",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "downtify",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "downtify",
|
||||
"image": "ghcr.io/henriquesebastiao/downtify:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"environment": {
|
||||
"PGID": "$PGID",
|
||||
"PUID": "$PUID",
|
||||
"TZ": "$TZ"
|
||||
},
|
||||
"image": "ghcr.io/henriquesebastiao/downtify:latest",
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "2048M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"ports": [
|
||||
{
|
||||
"target": 8000,
|
||||
"published": "8582",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"restart": "unless-stopped",
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/Downloads/downtify",
|
||||
"target": "/downloads"
|
||||
},
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/data",
|
||||
"target": "/data"
|
||||
}
|
||||
],
|
||||
"container_name": "downtify"
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "downtify"
|
||||
},
|
||||
"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": "downtify-volume-0",
|
||||
"service": "downtify",
|
||||
"container_path": "/downloads",
|
||||
"mode": "host-bind",
|
||||
"user_selectable": true,
|
||||
"backup": false,
|
||||
"shared_with_other_lxc": true,
|
||||
"source_path": null,
|
||||
"source_path_prompt": "Host directory for downtify:/downloads"
|
||||
},
|
||||
{
|
||||
"id": "downtify-volume-1",
|
||||
"service": "downtify",
|
||||
"container_path": "/data",
|
||||
"mode": "host-bind",
|
||||
"user_selectable": true,
|
||||
"backup": false,
|
||||
"shared_with_other_lxc": true,
|
||||
"source_path": null,
|
||||
"source_path_prompt": "Host directory for downtify:/data"
|
||||
}
|
||||
],
|
||||
"orchestration": {
|
||||
"reserve_vmids_atomically": 1,
|
||||
"start_order": [
|
||||
"downtify"
|
||||
],
|
||||
"stop_order": [
|
||||
"downtify"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 8000,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"credentials": []
|
||||
},
|
||||
"proxmox": {
|
||||
"runtime": "native-oci-lxc",
|
||||
"technology_status": "proxmox-technology-preview",
|
||||
"defaults": {
|
||||
"unprivileged": true,
|
||||
"ostype": "auto-from-image",
|
||||
"cores": 2,
|
||||
"memory_mb": 2048,
|
||||
"swap_mb": 512,
|
||||
"rootfs_size_gb": 8,
|
||||
"rootfs_storage": "local-lvm",
|
||||
"volume_storage": "local-lvm",
|
||||
"template_storage": "local",
|
||||
"bridge": "vmbr0",
|
||||
"ipv4": "dhcp",
|
||||
"firewall": true,
|
||||
"host_managed_network": true,
|
||||
"onboot": false,
|
||||
"features": [
|
||||
"nesting=1"
|
||||
],
|
||||
"shutdown_timeout_seconds": 30
|
||||
},
|
||||
"image_metadata_policy": {
|
||||
"entrypoint": "import-from-oci-image",
|
||||
"cmd": "import-from-oci-image",
|
||||
"environment": "import-image-env-then-apply-compose-overrides",
|
||||
"user": "import-from-oci-image",
|
||||
"working_dir": "import-from-oci-image",
|
||||
"stop_signal": "import-from-oci-image"
|
||||
},
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"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,405 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-dsh-harness",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "DeepSeekHarness"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "DeepSeek Harness \u201cEverything is a Plugin\u201c."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "DeepSeek Harness (dsh) is an open-source agent harness developed by DeepSeek AI."
|
||||
},
|
||||
"category": "ai",
|
||||
"category_label": "AI / Coding & Dev-Tools",
|
||||
"author": "DeepSeek",
|
||||
"developer": "DeepSeek",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 3080,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://www.deepseek.com",
|
||||
"documentation": null,
|
||||
"repository": "https://ghcr.io/smanx/deepseek-harness",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "smanx",
|
||||
"repository": "https://ghcr.io/smanx/deepseek-harness",
|
||||
"revision": "a8b6e3ae11af62c893064328db3da73a362e02c7a53b0c2e5e70331263afa878",
|
||||
"image_repository_url": "https://ghcr.io/smanx/deepseek-harness",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "a8b6e3ae11af62c893064328db3da73a362e02c7a53b0c2e5e70331263afa878",
|
||||
"generated_at": "2026-09-13T15:34:58+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "dsh",
|
||||
"container_name": "dsh-harness",
|
||||
"image": {
|
||||
"reference": "ghcr.io/smanx/deepseek-harness:latest",
|
||||
"registry": "ghcr.io",
|
||||
"repository": "ghcr.io/smanx/deepseek-harness",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/root/.dsh",
|
||||
"compose_source_example": "/DATA/AppData/$AppID",
|
||||
"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": 3080,
|
||||
"published_example": 3080,
|
||||
"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: dsh-harness\nservices:\n dsh:\n command: null\n container_name: dsh-harness\n entrypoint: null\n image: ghcr.io/smanx/deepseek-harness:latest\n labels:\n icon: https://cdn.jsdelivr.net/gh/selfhst/icons@main/png/deepseek.png\n networks:\n - default\n ports:\n - mode: ingress\n target: 3080\n published: '3080'\n protocol: tcp\n restart: unless-stopped\n volumes:\n - type: bind\n source: /DATA/AppData/$AppID\n target: /root/.dsh\n bind:\n create_host_path: true\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "dsh-harness",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "dsh",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "dsh",
|
||||
"image": "ghcr.io/smanx/deepseek-harness:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"command": null,
|
||||
"container_name": "dsh-harness",
|
||||
"entrypoint": null,
|
||||
"image": "ghcr.io/smanx/deepseek-harness:latest",
|
||||
"labels": {
|
||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/png/deepseek.png"
|
||||
},
|
||||
"networks": [
|
||||
"default"
|
||||
],
|
||||
"ports": [
|
||||
{
|
||||
"mode": "ingress",
|
||||
"target": 3080,
|
||||
"published": "3080",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"restart": "unless-stopped",
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID",
|
||||
"target": "/root/.dsh",
|
||||
"bind": {
|
||||
"create_host_path": true
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "dsh-harness"
|
||||
},
|
||||
"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": "dsh-volume-0",
|
||||
"service": "dsh",
|
||||
"container_path": "/root/.dsh",
|
||||
"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": [
|
||||
"dsh"
|
||||
],
|
||||
"stop_order": [
|
||||
"dsh"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 3080,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"behavioral_impact": "A privileged LXC has weaker isolation from the Proxmox host.",
|
||||
"validation": "native-equivalent"
|
||||
},
|
||||
{
|
||||
"id": "compose-process-runtime",
|
||||
"upstream_behavior": "Compose can replace Entrypoint, User and WorkingDir and request an init process or interactive terminal.",
|
||||
"native_lxc_behavior": "ProxMenux applies the process overrides through native LXC init directives; lxc-init provides PID 1 supervision and the CT console provides terminal access.",
|
||||
"reason": "The OCI process must start with the same identity, command and working directory without Docker.",
|
||||
"behavioral_impact": "Compose stdin_open and tty become access through the Proxmox LXC console.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-healthcheck",
|
||||
"upstream_behavior": "Docker periodically executes the declared container healthcheck.",
|
||||
"native_lxc_behavior": "For a single-service LXC, ProxMenux translates HTTP localhost checks into a mandatory first-start service check.",
|
||||
"reason": "Proxmox has no persistent Docker health state, while the installer still must detect a failed first boot.",
|
||||
"behavioral_impact": "The check runs during installation rather than continuously after installation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-cpu-priority",
|
||||
"upstream_behavior": "Docker cpu_shares sets a relative scheduling weight with 1024 as its neutral value.",
|
||||
"native_lxc_behavior": "ProxMenux converts the relative weight to Proxmox cpuunits with 100 as its neutral value and lets the user review it.",
|
||||
"reason": "Both settings express relative CPU priority on different scales.",
|
||||
"behavioral_impact": "Rounding and Proxmox minimum limits can slightly change very low weights.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"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,370 @@
|
||||
{
|
||||
"schema_version": "0.4.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-duckdns",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Duckdns"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Duckdns is a free service which will point a DNS (sub domains of duckdns.org) to an IP of your choice. The service is completely free, and doesn't require reactivation or forum posts to maintain its existence."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Duckdns is a free service which will point a DNS (sub domains of duckdns.org) to an IP of your choice. The service is completely free, and doesn't require reactivation or forum posts to maintain its existence."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/duckdns-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/duckdns-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": null,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://duckdns.org/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-duckdns/",
|
||||
"repository": "https://github.com/linuxserver/docker-duckdns",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-07-15",
|
||||
"note": "Rebase to Alpine 3.24."
|
||||
},
|
||||
{
|
||||
"date": "2025-07-27",
|
||||
"note": "Rebase to Alpine 3.22."
|
||||
},
|
||||
{
|
||||
"date": "2025-01-27",
|
||||
"note": "Rebase to Alpine 3.21."
|
||||
},
|
||||
{
|
||||
"date": "2024-06-24",
|
||||
"note": "Rebase to Alpine 3.20."
|
||||
},
|
||||
{
|
||||
"date": "2024-06-17",
|
||||
"note": "Bump CI_DELAY to 120 seconds as ARM builds were failing."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-07-15"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-duckdns",
|
||||
"default_branch": "master",
|
||||
"revision": "bf81649df47b7283ab0751d1fd34e1f768b0a546",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-duckdns/bf81649df47b7283ab0751d1fd34e1f768b0a546/README.md",
|
||||
"readme_pushed_at": "2026-09-07T08:51:40Z",
|
||||
"compose_sha256": "2d83e6a8e4d41ecad5aa9b30a6ace4f3458249ac429b8d5938902097f6cb283f",
|
||||
"generated_at": "2026-09-13T15:47:46+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "duckdns",
|
||||
"container_name": "duckdns",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/duckdns:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/duckdns",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "SUBDOMAINS",
|
||||
"example": "subdomain1,subdomain2",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TOKEN",
|
||||
"example": "token",
|
||||
"required": true,
|
||||
"sensitive": true,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "UPDATE_IP",
|
||||
"example": "ipv4",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "LOG_FILE",
|
||||
"example": "false",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/duckdns/config",
|
||||
"read_only": false,
|
||||
"required": false,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind",
|
||||
"skip"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 4
|
||||
}
|
||||
}
|
||||
],
|
||||
"ports": [],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n duckdns:\n image: lscr.io/linuxserver/duckdns:latest\n container_name: duckdns\n network_mode: host #optional\n environment:\n - PUID=1000 #optional\n - PGID=1000 #optional\n - TZ=Etc/UTC #optional\n - SUBDOMAINS=subdomain1,subdomain2\n - TOKEN=token\n - UPDATE_IP=ipv4 #optional\n - LOG_FILE=false #optional\n volumes:\n - /path/to/duckdns/config:/config #optional\n restart: unless-stopped\n"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"installer_profile": {
|
||||
"network": {
|
||||
"compose_mode": "host"
|
||||
}
|
||||
},
|
||||
"adaptations": [
|
||||
{
|
||||
"id": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-command",
|
||||
"upstream_behavior": "Compose replaces the image Cmd while retaining its Entrypoint.",
|
||||
"native_lxc_behavior": "ProxMenux reads the official OCI Entrypoint and combines it with the Compose command as the native LXC init command.",
|
||||
"reason": "Proxmox stores the effective OCI process as one entrypoint string.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-process-runtime",
|
||||
"upstream_behavior": "Compose can replace Entrypoint, User and WorkingDir and request an init process or interactive terminal.",
|
||||
"native_lxc_behavior": "ProxMenux applies the process overrides through native LXC init directives; lxc-init provides PID 1 supervision and the CT console provides terminal access.",
|
||||
"reason": "The OCI process must start with the same identity, command and working directory without Docker.",
|
||||
"behavioral_impact": "Compose stdin_open and tty become access through the Proxmox LXC console.",
|
||||
"validation": "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-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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-capabilities-and-sysctls",
|
||||
"upstream_behavior": "Compose can add Linux capabilities and set kernel parameters in the container network namespace.",
|
||||
"native_lxc_behavior": "ProxMenux validates requested capabilities against the native LXC capability set and writes namespaced network settings as lxc.sysctl directives.",
|
||||
"reason": "A native OCI-LXC already starts with the namespaced capability set; lxc.cap.keep would incorrectly discard unrelated required capabilities.",
|
||||
"behavioral_impact": "Host-global capabilities such as SYS_MODULE remain blocked until their host prerequisite is explicitly adapted.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"cap_add",
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"sysctls",
|
||||
"tty",
|
||||
"user",
|
||||
"volumes",
|
||||
"working_dir"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,269 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-duckstation",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Duckstation"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "DuckStation is a PS1 Emulator aiming for the best accuracy and game support."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "DuckStation is a PS1 Emulator aiming for the best accuracy and game support."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/duckstation-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/duckstation-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://duckstation.org/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-duckstation/",
|
||||
"repository": "https://github.com/linuxserver/docker-duckstation",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-03-05",
|
||||
"note": "Make Wayland default disable with PIXELFLUX_WAYLAND=false."
|
||||
},
|
||||
{
|
||||
"date": "2025-12-20",
|
||||
"note": "Add Wayland init logic."
|
||||
},
|
||||
{
|
||||
"date": "2025-09-22",
|
||||
"note": "Rebase to Debian Trixie."
|
||||
},
|
||||
{
|
||||
"date": "2025-06-19",
|
||||
"note": "Initial release."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-03-05"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-duckstation",
|
||||
"default_branch": "master",
|
||||
"revision": "7fffa14503a4eda3ec1f7dfc459178536878f9c3",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-duckstation/7fffa14503a4eda3ec1f7dfc459178536878f9c3/README.md",
|
||||
"readme_pushed_at": "2026-09-09T05:35:37Z",
|
||||
"compose_sha256": "5731f361cdddf5bb5b74cb5222d288997e7f492d9c5189a8c9edc9e1a0aa7cd0",
|
||||
"generated_at": "2026-09-12T14:37:26+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "duckstation",
|
||||
"container_name": "duckstation",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/duckstation:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/duckstation",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/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": 3000,
|
||||
"published_example": 3000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 3001,
|
||||
"published_example": 3001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n duckstation:\n image: lscr.io/linuxserver/duckstation:latest\n container_name: duckstation\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/config:/config\n ports:\n - 3000:3000\n - 3001:3001\n shm_size: \"1gb\"\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
}
|
||||
],
|
||||
"installer_profile": {
|
||||
"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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"shm_size",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,321 @@
|
||||
{
|
||||
"schema_version": "0.4.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-duplicati",
|
||||
"status": "laboratory-validated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Duplicati"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Duplicati is a backup client that securely stores encrypted, incremental, compressed backups on local storage, cloud storage services and remote file servers. It works with standard protocols like FTP, SSH, WebDAV as well as popular services like Microsoft OneDrive, Amazon S3, Google Drive, box.com, Mega, B2, and many others."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Duplicati is a backup client that securely stores encrypted, incremental, compressed backups on local storage, cloud storage services and remote file servers. It works with standard protocols like FTP, SSH, WebDAV as well as popular services like Microsoft OneDrive, Amazon S3, Google Drive, box.com, Mega, B2, and many others."
|
||||
},
|
||||
"category": "backup",
|
||||
"category_label": "Backup & Recovery",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/duplicati-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/duplicati-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 8200,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://www.duplicati.com/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-duplicati/",
|
||||
"repository": "https://github.com/linuxserver/docker-duplicati",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-09-03",
|
||||
"note": "Make sure /config is only accessible by the PUID user."
|
||||
},
|
||||
{
|
||||
"date": "2025-01-31",
|
||||
"note": "Make `latest` stable releases, move beta releases to `development`."
|
||||
},
|
||||
{
|
||||
"date": "2025-01-28",
|
||||
"note": "Add xz-utils."
|
||||
},
|
||||
{
|
||||
"date": "2024-12-03",
|
||||
"note": "Add mscorefonts for captcha support."
|
||||
},
|
||||
{
|
||||
"date": "2024-11-29",
|
||||
"note": "Rebase to Noble, add support for settings DB encryption."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-09-03"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-duplicati",
|
||||
"default_branch": "master",
|
||||
"revision": "63a71b5a130e008f9bf20df18820f6bee1b771f3",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-duplicati/63a71b5a130e008f9bf20df18820f6bee1b771f3/README.md",
|
||||
"readme_pushed_at": "2026-09-12T08:31:37Z",
|
||||
"compose_sha256": "5f149ca1dc249caeec8903c4d9f08c5632ff52e1ec28cee05259a431f830cbaa",
|
||||
"generated_at": "2026-09-13T14:38:33+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "duplicati",
|
||||
"container_name": "duplicati",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/duplicati:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/duplicati",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "SETTINGS_ENCRYPTION_KEY",
|
||||
"example": "",
|
||||
"required": true,
|
||||
"sensitive": true,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "CLI_ARGS",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "DUPLICATI__WEBSERVICE_PASSWORD",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": true,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/duplicati/config",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 4
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-1",
|
||||
"container_path": "/backups",
|
||||
"compose_source_example": "/path/to/backups",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-2",
|
||||
"container_path": "/source",
|
||||
"compose_source_example": "/path/to/source",
|
||||
"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": 8200,
|
||||
"published_example": 8200,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n duplicati:\n image: lscr.io/linuxserver/duplicati:latest\n container_name: duplicati\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n - SETTINGS_ENCRYPTION_KEY=\n - CLI_ARGS= #optional\n - DUPLICATI__WEBSERVICE_PASSWORD= #optional\n volumes:\n - /path/to/duplicati/config:/config\n - /path/to/backups:/backups\n - /path/to/source:/source\n ports:\n - 8200:8200\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 8200,
|
||||
"path": "/",
|
||||
"source": "compose-first-tcp-port-fallback"
|
||||
}
|
||||
],
|
||||
"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"
|
||||
},
|
||||
"installer_profile": {
|
||||
"generated_sensitive_environment": {
|
||||
"SETTINGS_ENCRYPTION_KEY": {
|
||||
"strategy": "token-hex",
|
||||
"bytes": 16,
|
||||
"prompt": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"adaptations": [
|
||||
{
|
||||
"id": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-command",
|
||||
"upstream_behavior": "Compose replaces the image Cmd while retaining its Entrypoint.",
|
||||
"native_lxc_behavior": "ProxMenux reads the official OCI Entrypoint and combines it with the Compose command as the native LXC init command.",
|
||||
"reason": "Proxmox stores the effective OCI process as one entrypoint string.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"shm_size",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "passed-amd64",
|
||||
"service_health": "passed-amd64",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,268 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-eden",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Eden"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Eden is an experimental open-source emulator for the Nintendo Switch, built with performance and stability in mind."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Eden is an experimental open-source emulator for the Nintendo Switch, built with performance and stability in mind."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/eden-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/eden-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://eden-emu.dev/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-eden/",
|
||||
"repository": "https://github.com/linuxserver/docker-eden",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-06-30",
|
||||
"note": "Optimize build to match PGO v3 builds for better performance."
|
||||
},
|
||||
{
|
||||
"date": "2026-05-05",
|
||||
"note": "Rebase to Debian Trixie, build Eden from source, remove arm64 tag."
|
||||
},
|
||||
{
|
||||
"date": "2026-03-17",
|
||||
"note": "Ingest releases from self hosted git."
|
||||
},
|
||||
{
|
||||
"date": "2026-02-18",
|
||||
"note": "Initial Version."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-06-30"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-eden",
|
||||
"default_branch": "master",
|
||||
"revision": "02aca45158b16c78c91d6e2da9494b6420fd682a",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-eden/02aca45158b16c78c91d6e2da9494b6420fd682a/README.md",
|
||||
"readme_pushed_at": "2026-09-10T08:58:13Z",
|
||||
"compose_sha256": "77b0432ece0eed1422b9490813b6da52f22ab522a62f770b089339bdf4b25f19",
|
||||
"generated_at": "2026-09-12T14:37:26+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "eden",
|
||||
"container_name": "eden",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/eden:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/eden",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/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": 3000,
|
||||
"published_example": 3000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 3001,
|
||||
"published_example": 3001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n eden:\n image: lscr.io/linuxserver/eden:latest\n container_name: eden\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/config:/config\n ports:\n - 3000:3000\n - 3001:3001\n shm_size: \"1gb\"\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
}
|
||||
],
|
||||
"installer_profile": {
|
||||
"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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"shm_size",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,486 @@
|
||||
{
|
||||
"schema_version": "0.4.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-emby-official",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Emby Official"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Official Emby Media Server image with optional VA-API or NVIDIA acceleration."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Emby is a personal media management platform that brings home videos, music, and photos together, automatically converting and streaming to any device. An intuitive design makes it ideal for users to enjoy media content anytime, anywhere, meeting family entertainment and media management needs.\n\nCore features include cross-device media streaming and easy access. It supports real-time conversion and streaming of personal media to any device for seamless playback. A connection service enables easy media access while away from home. Live TV functionality supports streaming, managing DVR, and accessing a library of recordings. Mobile sync delivers media to smartphones and tablets for offline access, automatically updating new content.\n\nIt offers parental controls to restrict children's content access, set schedules and time limits, and remotely monitor sessions. Chromecast support enables easy streaming of videos, music, photos, and Live TV. Content is presented elegantly, enhancing visual experience. Cloud sync supports backup, archiving, and multi-resolution storage for optimized streaming. Web-based media management facilitates editing metadata, images, and searching subtitles, while DLNA integration auto-detects network devices for content streaming. With convenience and versatility at the core, the platform delivers a modern media management solution.\n\n**Key Features:**\n- Automatic conversion and streaming of media to any device\n- Easy access via connection service while away from home\n- Live TV streaming, DVR management, and recording library access\n- Mobile sync to smartphones and tablets for offline access\n- Parental controls with content restrictions, schedules, and remote monitoring\n- Chromecast support for streaming videos, music, photos, and Live TV\n- Cloud sync for backup and multi-resolution storage\n- Web-based media management for editing metadata and searching subtitles\n- DLNA integration for auto-detecting network devices and streaming content\n\n**Learn More:**\n- [Emby Official Website](https://emby.media/)\n"
|
||||
},
|
||||
"category": "media",
|
||||
"category_label": "Media & Streaming",
|
||||
"author": "Emby Team",
|
||||
"developer": "Emby Team",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 8096,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://emby.media/",
|
||||
"documentation": "https://hub.docker.com/r/emby/embyserver",
|
||||
"repository": "https://hub.docker.com/r/emby/embyserver",
|
||||
"tips": [
|
||||
"UID, GID and GIDLIST follow the official image contract.",
|
||||
"The installer adds the selected render-device GID to GIDLIST for VA-API access.",
|
||||
"Emby documents VA-API and NVDEC/NVENC support for amd64 only."
|
||||
],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "emby",
|
||||
"repository": "https://hub.docker.com/r/emby/embyserver",
|
||||
"default_branch": "master",
|
||||
"revision": "f324967b88a13e1075d6aa6debe31a955a7c6b47abe4c2d34342bc9d1d964518",
|
||||
"image_repository_url": "https://hub.docker.com/r/emby/embyserver",
|
||||
"compose_sha256": "b960d39e446660d21c2e88e89d6ae2ce3e1294c31d9d4ee18b8a94c7b9e8d786",
|
||||
"generated_at": "2026-09-13T21:08:59+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "emby",
|
||||
"container_name": "embyserver",
|
||||
"image": {
|
||||
"reference": "emby/embyserver:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "emby/embyserver",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "UID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "official-container-documentation",
|
||||
"prompt": "UID that Emby runs as"
|
||||
},
|
||||
{
|
||||
"name": "GID",
|
||||
"example": "100",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "official-container-documentation",
|
||||
"prompt": "Primary GID for Emby"
|
||||
},
|
||||
{
|
||||
"name": "GIDLIST",
|
||||
"example": "100",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "official-container-documentation",
|
||||
"prompt": "Additional media/GPU GIDs, comma-separated"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "config",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/programdata",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "tvshows",
|
||||
"container_path": "/mnt/share1",
|
||||
"compose_source_example": "/path/to/tvshows",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "host-bind",
|
||||
"managed_volume": {
|
||||
"backup": false,
|
||||
"default_size_gb": 32
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "movies",
|
||||
"container_path": "/mnt/share2",
|
||||
"compose_source_example": "/path/to/movies",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "host-bind",
|
||||
"managed_volume": {
|
||||
"backup": false,
|
||||
"default_size_gb": 32
|
||||
}
|
||||
}
|
||||
],
|
||||
"ports": [
|
||||
{
|
||||
"container_port": 8096,
|
||||
"published_example": 8096,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 8920,
|
||||
"published_example": 8920,
|
||||
"protocol": "tcp",
|
||||
"required": false,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 7359,
|
||||
"published_example": 7359,
|
||||
"protocol": "udp",
|
||||
"required": false,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 1900,
|
||||
"published_example": 1900,
|
||||
"protocol": "udp",
|
||||
"required": false,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "on-failure",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "services:\n emby:\n image: emby/embyserver:latest\n container_name: embyserver\n environment:\n - UID=1000\n - GID=100\n - GIDLIST=100\n volumes:\n - /path/to/programdata:/config\n - /path/to/tvshows:/mnt/share1\n - /path/to/movies:/mnt/share2\n ports:\n - 8096:8096/tcp\n - 8920:8920/tcp\n restart: on-failure\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Emby WebUI",
|
||||
"scheme": "http",
|
||||
"port": 8096,
|
||||
"path": "/",
|
||||
"source": "official-container-documentation"
|
||||
}
|
||||
],
|
||||
"credentials": []
|
||||
},
|
||||
"proxmox": {
|
||||
"runtime": "native-oci-lxc",
|
||||
"technology_status": "proxmox-technology-preview",
|
||||
"defaults": {
|
||||
"unprivileged": true,
|
||||
"ostype": "auto-from-image",
|
||||
"cores": 2,
|
||||
"memory_mb": 2048,
|
||||
"swap_mb": 512,
|
||||
"rootfs_size_gb": 8,
|
||||
"rootfs_storage": "local-lvm",
|
||||
"volume_storage": "local-lvm",
|
||||
"template_storage": "local",
|
||||
"bridge": "vmbr0",
|
||||
"ipv4": "dhcp",
|
||||
"firewall": true,
|
||||
"host_managed_network": true,
|
||||
"onboot": false,
|
||||
"features": [
|
||||
"nesting=1"
|
||||
],
|
||||
"shutdown_timeout_seconds": 30
|
||||
},
|
||||
"image_metadata_policy": {
|
||||
"entrypoint": "import-from-oci-image",
|
||||
"cmd": "import-from-oci-image",
|
||||
"environment": "import-image-env-then-apply-compose-overrides",
|
||||
"user": "import-from-oci-image",
|
||||
"working_dir": "import-from-oci-image",
|
||||
"stop_signal": "import-from-oci-image"
|
||||
},
|
||||
"installer_profile": {
|
||||
"hardware_acceleration": {
|
||||
"prompt": "Hardware acceleration for Emby",
|
||||
"default": "none",
|
||||
"profiles": [
|
||||
{
|
||||
"id": "none",
|
||||
"label": "No acceleration (CPU)",
|
||||
"device_requests": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "vaapi",
|
||||
"label": "Intel/AMD (VA-API)",
|
||||
"device_requests": [
|
||||
{
|
||||
"id": "vaapi-render",
|
||||
"kind": "character-device",
|
||||
"purpose": "vaapi",
|
||||
"path_prompt": "GPU render device",
|
||||
"host_path_default": "/dev/dri/renderD128",
|
||||
"container_path_strategy": "same-as-host",
|
||||
"mode": "0660",
|
||||
"deny_write": false,
|
||||
"gid_strategy": "host-device-gid",
|
||||
"append_host_device_gid_to_environment": "GIDLIST"
|
||||
}
|
||||
],
|
||||
"architectures": [
|
||||
"amd64"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "nvidia",
|
||||
"label": "NVIDIA (NVENC/NVDEC)",
|
||||
"device_requests": [
|
||||
{
|
||||
"id": "nvidia-runtime",
|
||||
"kind": "nvidia-runtime",
|
||||
"purpose": "nvidia-cuda-nvenc-nvdec",
|
||||
"device_selection": "all-requested-by-compose",
|
||||
"append_host_device_gid_to_environment": "GIDLIST"
|
||||
}
|
||||
],
|
||||
"environment": [
|
||||
{
|
||||
"name": "NVIDIA_VISIBLE_DEVICES",
|
||||
"value": "all"
|
||||
}
|
||||
],
|
||||
"architectures": [
|
||||
"amd64"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"startup_healthcheck": {
|
||||
"scheme": "http",
|
||||
"port": 8096,
|
||||
"path": "/",
|
||||
"timeout_seconds": 240,
|
||||
"request_timeout_seconds": 10,
|
||||
"stability_seconds": 4,
|
||||
"verify_tls": false
|
||||
},
|
||||
"volume_preparations": [
|
||||
{
|
||||
"container_path": "/config",
|
||||
"remove_lost_found": true,
|
||||
"owner_strategy": "mapped-application-user",
|
||||
"only_when_mount_type": "managed-volume"
|
||||
}
|
||||
],
|
||||
"gpu_validation": {
|
||||
"device_inventory": "host-sysfs-and-stat",
|
||||
"application_acceleration": "requires-workload-test",
|
||||
"tone_mapping": "not-implied-by-device-access"
|
||||
}
|
||||
},
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"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"
|
||||
}
|
||||
],
|
||||
"deployment_profile": {
|
||||
"variant": "hardware-selectable",
|
||||
"gpu_passthrough": "installer-selection"
|
||||
},
|
||||
"catalog": {
|
||||
"replaces_discovered_ids": [
|
||||
"emby",
|
||||
"emby-nvidia"
|
||||
]
|
||||
},
|
||||
"application_options": {
|
||||
"hardware_transcoding": {
|
||||
"show_in_catalog": true,
|
||||
"selectable": true,
|
||||
"documented_acceleration_architectures": [
|
||||
"amd64"
|
||||
],
|
||||
"backends": [
|
||||
"VA-API",
|
||||
"NVDEC/NVENC"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"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,464 @@
|
||||
{
|
||||
"schema_version": "0.4.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-emby",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Emby"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Emby organizes video, music, live TV, and photos from personal media libraries and streams them to smart TVs, streaming boxes and mobile devices. This container is packaged as a standalone emby Media Server."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Emby organizes video, music, live TV, and photos from personal media libraries and streams them to smart TVs, streaming boxes and mobile devices. This container is packaged as a standalone emby Media Server."
|
||||
},
|
||||
"category": "media",
|
||||
"category_label": "Media & Streaming",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/emby-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/emby-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 8096,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://emby.media/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-emby/",
|
||||
"repository": "https://github.com/linuxserver/docker-emby",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-09-11",
|
||||
"note": "Update lib paths to fix hw transcoding."
|
||||
},
|
||||
{
|
||||
"date": "2026-07-14",
|
||||
"note": "Rebase to Ubuntu Resolute."
|
||||
},
|
||||
{
|
||||
"date": "2026-01-12",
|
||||
"note": "Set home to /config."
|
||||
},
|
||||
{
|
||||
"date": "2024-08-13",
|
||||
"note": "Rebase to Ubuntu Noble."
|
||||
},
|
||||
{
|
||||
"date": "2024-02-12",
|
||||
"note": "Use universal hardware acceleration blurb"
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-09-11"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-emby",
|
||||
"default_branch": "master",
|
||||
"revision": "462ada8bab73929feed69a32dc77a61de865c307",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-emby/462ada8bab73929feed69a32dc77a61de865c307/README.md",
|
||||
"readme_pushed_at": "2026-09-11T15:36:08Z",
|
||||
"compose_sha256": "70fe3039076834edadd9ff1f383f9497f87186921225c5d47d8119c9b0473a39",
|
||||
"generated_at": "2026-09-13T15:35:42+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "emby",
|
||||
"container_name": "emby",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/emby:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/emby",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/emby/library",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 4
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-1",
|
||||
"container_path": "/data/tvshows",
|
||||
"compose_source_example": "/path/to/tvshows",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-2",
|
||||
"container_path": "/data/movies",
|
||||
"compose_source_example": "/path/to/movies",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-3",
|
||||
"container_path": "/opt/vc/lib",
|
||||
"compose_source_example": "/opt/vc/lib",
|
||||
"read_only": false,
|
||||
"required": false,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind",
|
||||
"skip"
|
||||
],
|
||||
"default": "skip",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
}
|
||||
],
|
||||
"ports": [
|
||||
{
|
||||
"container_port": 8096,
|
||||
"published_example": 8096,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 8920,
|
||||
"published_example": 8920,
|
||||
"protocol": "tcp",
|
||||
"required": false,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n emby:\n image: lscr.io/linuxserver/emby:latest\n container_name: emby\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/emby/library:/config\n - /path/to/tvshows:/data/tvshows\n - /path/to/movies:/data/movies\n - /opt/vc/lib:/opt/vc/lib #optional\n ports:\n - 8096:8096\n - 8920:8920 #optional\n devices:\n - /dev/dri:/dev/dri #optional\n - /dev/video10:/dev/video10 #optional\n - /dev/video11:/dev/video11 #optional\n - /dev/video12:/dev/video12 #optional\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 8096,
|
||||
"path": "/",
|
||||
"source": "compose-first-tcp-port-fallback"
|
||||
}
|
||||
],
|
||||
"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"
|
||||
},
|
||||
"installer_profile": {
|
||||
"device_requests": [
|
||||
{
|
||||
"id": "vaapi-render",
|
||||
"kind": "character-device",
|
||||
"purpose": "vaapi",
|
||||
"enable_prompt": "VA-API video acceleration",
|
||||
"enabled_default": false,
|
||||
"required_by_compose": false,
|
||||
"path_prompt": "GPU render device",
|
||||
"host_path_default": "/dev/dri/renderD128",
|
||||
"container_path_strategy": "same-as-host",
|
||||
"mode": "0660",
|
||||
"deny_write": false,
|
||||
"gid_strategy": "host-device-gid",
|
||||
"source_mapping": "/dev/dri:/dev/dri"
|
||||
},
|
||||
{
|
||||
"id": "dev-video10",
|
||||
"kind": "character-device",
|
||||
"purpose": "video-capture",
|
||||
"enable_prompt": "Pass /dev/video10 to the LXC",
|
||||
"enabled_default": false,
|
||||
"required_by_compose": false,
|
||||
"path_prompt": "Host device for /dev/video10",
|
||||
"host_path_default": "/dev/video10",
|
||||
"container_path": "/dev/video10",
|
||||
"mode": "preserve-host",
|
||||
"deny_write": false,
|
||||
"gid_strategy": "host-device-gid",
|
||||
"source_mapping": "/dev/video10:/dev/video10"
|
||||
},
|
||||
{
|
||||
"id": "dev-video11",
|
||||
"kind": "character-device",
|
||||
"purpose": "video-capture",
|
||||
"enable_prompt": "Pass /dev/video11 to the LXC",
|
||||
"enabled_default": false,
|
||||
"required_by_compose": false,
|
||||
"path_prompt": "Host device for /dev/video11",
|
||||
"host_path_default": "/dev/video11",
|
||||
"container_path": "/dev/video11",
|
||||
"mode": "preserve-host",
|
||||
"deny_write": false,
|
||||
"gid_strategy": "host-device-gid",
|
||||
"source_mapping": "/dev/video11:/dev/video11"
|
||||
},
|
||||
{
|
||||
"id": "dev-video12",
|
||||
"kind": "character-device",
|
||||
"purpose": "video-capture",
|
||||
"enable_prompt": "Pass /dev/video12 to the LXC",
|
||||
"enabled_default": false,
|
||||
"required_by_compose": false,
|
||||
"path_prompt": "Host device for /dev/video12",
|
||||
"host_path_default": "/dev/video12",
|
||||
"container_path": "/dev/video12",
|
||||
"mode": "preserve-host",
|
||||
"deny_write": false,
|
||||
"gid_strategy": "host-device-gid",
|
||||
"source_mapping": "/dev/video12:/dev/video12"
|
||||
}
|
||||
],
|
||||
"gpu_validation": {
|
||||
"device_inventory": "host-sysfs-and-stat",
|
||||
"application_acceleration": "requires-workload-test",
|
||||
"tone_mapping": "not-implied-by-device-access"
|
||||
},
|
||||
"device_permissions": {
|
||||
"strategy": "linuxserver-native-init",
|
||||
"service_user": "abc",
|
||||
"environment": "ATTACHED_DEVICES_PERMS",
|
||||
"paths": "all-resolved-selected-character-devices"
|
||||
}
|
||||
},
|
||||
"adaptations": [
|
||||
{
|
||||
"id": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-command",
|
||||
"upstream_behavior": "Compose replaces the image Cmd while retaining its Entrypoint.",
|
||||
"native_lxc_behavior": "ProxMenux reads the official OCI Entrypoint and combines it with the Compose command as the native LXC init command.",
|
||||
"reason": "Proxmox stores the effective OCI process as one entrypoint string.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-process-runtime",
|
||||
"upstream_behavior": "Compose can replace Entrypoint, User and WorkingDir and request an init process or interactive terminal.",
|
||||
"native_lxc_behavior": "ProxMenux applies the process overrides through native LXC init directives; lxc-init provides PID 1 supervision and the CT console provides terminal access.",
|
||||
"reason": "The OCI process must start with the same identity, command and working directory without Docker.",
|
||||
"behavioral_impact": "Compose stdin_open and tty become access through the Proxmox LXC console.",
|
||||
"validation": "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-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": "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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"user",
|
||||
"volumes",
|
||||
"working_dir"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,428 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-embystat",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Embystat"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Calculate all kinds of statistics from your (local) Emby or Jellyfin server"
|
||||
},
|
||||
"description": {
|
||||
"en_US": "EmbyStat is a personal web server that can calculate all kinds of statistics from your (local) Emby or Jellyfin server. Just install this on your server and let him calculate all kinds of fun stuff. This project is still in Alpha phase, but feel free to pull in on your computer and test it out yourself. When the time is right I will host a full informational website/release for common platforms and Wiki pages."
|
||||
},
|
||||
"category": "media",
|
||||
"category_label": "Media & Streaming",
|
||||
"author": "Embystart Team",
|
||||
"developer": "Embystart Team",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 6555,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-embystat/",
|
||||
"repository": "https://hub.docker.com/r/linuxserver/embystat",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://hub.docker.com/r/linuxserver/embystat",
|
||||
"revision": "842f624b097fb12f04cae3d3329c232d675fd0f95e1262978da58da85353f202",
|
||||
"image_repository_url": "https://hub.docker.com/r/linuxserver/embystat",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "842f624b097fb12f04cae3d3329c232d675fd0f95e1262978da58da85353f202",
|
||||
"generated_at": "2026-09-13T15:34:58+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "embystat",
|
||||
"container_name": "embystat",
|
||||
"image": {
|
||||
"reference": "linuxserver/embystat:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "linuxserver/embystat",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Europe/London",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/DATA/AppData/embystat/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": 6555,
|
||||
"published_example": 6555,
|
||||
"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: embystat\nservices:\n embystat:\n environment:\n PGID: '1000'\n PUID: '1000'\n TZ: Europe/London\n image: linuxserver/embystat:latest\n deploy:\n resources:\n reservations:\n memory: 64M\n network_mode: bridge\n ports:\n - target: 6555\n published: '6555'\n protocol: tcp\n restart: unless-stopped\n volumes:\n - type: bind\n source: /DATA/AppData/embystat/config\n target: /config\n container_name: embystat\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "embystat",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "embystat",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "embystat",
|
||||
"image": "linuxserver/embystat:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"environment": {
|
||||
"PGID": "1000",
|
||||
"PUID": "1000",
|
||||
"TZ": "Europe/London"
|
||||
},
|
||||
"image": "linuxserver/embystat:latest",
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "64M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"network_mode": "bridge",
|
||||
"ports": [
|
||||
{
|
||||
"target": 6555,
|
||||
"published": "6555",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"restart": "unless-stopped",
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/embystat/config",
|
||||
"target": "/config"
|
||||
}
|
||||
],
|
||||
"container_name": "embystat"
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "embystat"
|
||||
},
|
||||
"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": "embystat-volume-0",
|
||||
"service": "embystat",
|
||||
"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": [
|
||||
"embystat"
|
||||
],
|
||||
"stop_order": [
|
||||
"embystat"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 6555,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"credentials": []
|
||||
},
|
||||
"proxmox": {
|
||||
"runtime": "native-oci-lxc",
|
||||
"technology_status": "proxmox-technology-preview",
|
||||
"defaults": {
|
||||
"unprivileged": true,
|
||||
"ostype": "auto-from-image",
|
||||
"cores": 2,
|
||||
"memory_mb": 128,
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"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,555 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-emulatorjs",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "emulatorjs"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "EmulatorJS is a Docker-based emulator application that can simulate various operating systems and device environments within containers for development, testing, and learning purposes."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "EmulatorJS is a Docker-based emulator application that can simulate various operating systems and device environments within containers for development, testing, and learning purposes."
|
||||
},
|
||||
"category": "media",
|
||||
"category_label": "Media & Streaming",
|
||||
"author": "linuxserver.io",
|
||||
"developer": null,
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 80,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://emulatorjs.org/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-emulatorjs/",
|
||||
"repository": "https://hub.docker.com/r/linuxserver/emulatorjs",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://hub.docker.com/r/linuxserver/emulatorjs",
|
||||
"revision": "155869dc2c09f26534a98d6f79e3dd52ff076e1f5855108e74fc686005c048bf",
|
||||
"image_repository_url": "https://hub.docker.com/r/linuxserver/emulatorjs",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "155869dc2c09f26534a98d6f79e3dd52ff076e1f5855108e74fc686005c048bf",
|
||||
"generated_at": "2026-09-13T17:20:20+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "emulatorjs",
|
||||
"container_name": "emulatorjs",
|
||||
"image": {
|
||||
"reference": "linuxserver/emulatorjs:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "linuxserver/emulatorjs",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "$PGID",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "$PUID",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "SUBFOLDER",
|
||||
"example": "/",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "$TZ",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/DATA/AppData/$AppID/config",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 4
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-1",
|
||||
"container_path": "/data",
|
||||
"compose_source_example": "/DATA/AppData/$AppID/data",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-2",
|
||||
"container_path": "/data/nes/roms",
|
||||
"compose_source_example": "/ROMS/nes",
|
||||
"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": 3000,
|
||||
"published_example": 3001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 4001,
|
||||
"published_example": 4001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 80,
|
||||
"published_example": 88,
|
||||
"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: emulatorjs\nservices:\n emulatorjs:\n environment:\n - PGID=$PGID\n - PUID=$PUID\n - SUBFOLDER=/\n - TZ=$TZ\n image: linuxserver/emulatorjs:latest\n network_mode: bridge\n ports:\n - target: 3000\n published: '3001'\n protocol: tcp\n - target: 4001\n published: '4001'\n protocol: tcp\n - target: 80\n published: '88'\n protocol: tcp\n privileged: true\n restart: unless-stopped\n volumes:\n - type: bind\n source: /DATA/AppData/$AppID/config\n target: /config\n - type: bind\n source: /DATA/AppData/$AppID/data\n target: /data\n - type: bind\n source: /ROMS/nes\n target: /data/nes/roms\n container_name: emulatorjs\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "emulatorjs",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "emulatorjs",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "emulatorjs",
|
||||
"image": "linuxserver/emulatorjs:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"environment": [
|
||||
"PGID=$PGID",
|
||||
"PUID=$PUID",
|
||||
"SUBFOLDER=/",
|
||||
"TZ=$TZ"
|
||||
],
|
||||
"image": "linuxserver/emulatorjs:latest",
|
||||
"network_mode": "bridge",
|
||||
"ports": [
|
||||
{
|
||||
"target": 3000,
|
||||
"published": "3001",
|
||||
"protocol": "tcp"
|
||||
},
|
||||
{
|
||||
"target": 4001,
|
||||
"published": "4001",
|
||||
"protocol": "tcp"
|
||||
},
|
||||
{
|
||||
"target": 80,
|
||||
"published": "88",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"privileged": true,
|
||||
"restart": "unless-stopped",
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/config",
|
||||
"target": "/config"
|
||||
},
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/data",
|
||||
"target": "/data"
|
||||
},
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/ROMS/nes",
|
||||
"target": "/data/nes/roms"
|
||||
}
|
||||
],
|
||||
"container_name": "emulatorjs"
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "emulatorjs"
|
||||
},
|
||||
"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": "emulatorjs-volume-0",
|
||||
"service": "emulatorjs",
|
||||
"container_path": "/config",
|
||||
"mode": "managed-volume",
|
||||
"user_selectable": false,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"source_path": null,
|
||||
"source_path_prompt": null
|
||||
},
|
||||
{
|
||||
"id": "emulatorjs-volume-1",
|
||||
"service": "emulatorjs",
|
||||
"container_path": "/data",
|
||||
"mode": "host-bind",
|
||||
"user_selectable": true,
|
||||
"backup": false,
|
||||
"shared_with_other_lxc": true,
|
||||
"source_path": null,
|
||||
"source_path_prompt": "Host directory for emulatorjs:/data"
|
||||
},
|
||||
{
|
||||
"id": "emulatorjs-volume-2",
|
||||
"service": "emulatorjs",
|
||||
"container_path": "/data/nes/roms",
|
||||
"mode": "host-bind",
|
||||
"user_selectable": true,
|
||||
"backup": false,
|
||||
"shared_with_other_lxc": true,
|
||||
"source_path": null,
|
||||
"source_path_prompt": "Host directory for emulatorjs:/data/nes/roms"
|
||||
}
|
||||
],
|
||||
"orchestration": {
|
||||
"reserve_vmids_atomically": 1,
|
||||
"start_order": [
|
||||
"emulatorjs"
|
||||
],
|
||||
"stop_order": [
|
||||
"emulatorjs"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 80,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"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"
|
||||
},
|
||||
"installer_profile": {
|
||||
"network": {
|
||||
"compose_mode": "bridge"
|
||||
}
|
||||
},
|
||||
"security_profile": {
|
||||
"requires_privileged_lxc": false,
|
||||
"source_requests_privileged_lxc": true,
|
||||
"optional_privileged_lxc": true,
|
||||
"requires_host_pid_namespace": false,
|
||||
"source_requests_relaxed_confinement": false,
|
||||
"requires_relaxed_confinement": false,
|
||||
"optional_relaxed_confinement": false,
|
||||
"risk_level": "high",
|
||||
"confirmation_required": false,
|
||||
"warning": "The source Compose requests privileged: true, but this does not prove that the image needs a privileged LXC. ProxMenux will use an unprivileged LXC by default and will offer the broad mode only as an option. Continue only if you trust the image and accept this risk."
|
||||
},
|
||||
"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": "optional-explicit-user-consent"
|
||||
},
|
||||
{
|
||||
"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-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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-capabilities-and-sysctls",
|
||||
"upstream_behavior": "Compose can add Linux capabilities and set kernel parameters in the container network namespace.",
|
||||
"native_lxc_behavior": "ProxMenux validates requested capabilities against the native LXC capability set and writes namespaced network settings as lxc.sysctl directives.",
|
||||
"reason": "A native OCI-LXC already starts with the namespaced capability set; lxc.cap.keep would incorrectly discard unrelated required capabilities.",
|
||||
"behavioral_impact": "Host-global capabilities such as SYS_MODULE remain blocked until their host prerequisite is explicitly adapted.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"cap_add",
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"group_add",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"security_opt",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"sysctls",
|
||||
"tty",
|
||||
"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,421 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-esphome",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "ESPHome"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Home Automation systems"
|
||||
},
|
||||
"description": {
|
||||
"en_US": "ESPHome is a system to control your microcontrollers by simple yet powerful configuration files and control them remotely through Home Automation systems."
|
||||
},
|
||||
"category": "smarthome",
|
||||
"category_label": "IoT & Smart Home",
|
||||
"author": "official",
|
||||
"developer": null,
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 6052,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://esphome.io",
|
||||
"documentation": null,
|
||||
"repository": "https://ghcr.io/esphome/esphome",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "official",
|
||||
"repository": "https://ghcr.io/esphome/esphome",
|
||||
"revision": "779c5ca7e920e78c63eabbe87192450b47bdf25c8e3e1d3394545ae77ea8b6e3",
|
||||
"image_repository_url": "https://ghcr.io/esphome/esphome",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "779c5ca7e920e78c63eabbe87192450b47bdf25c8e3e1d3394545ae77ea8b6e3",
|
||||
"generated_at": "2026-09-13T15:34:58+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "esphome",
|
||||
"container_name": "esphome",
|
||||
"image": {
|
||||
"reference": "ghcr.io/esphome/esphome:latest",
|
||||
"registry": "ghcr.io",
|
||||
"repository": "ghcr.io/esphome/esphome",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "ESPHOME_DASHBOARD_USE_PING",
|
||||
"example": "false",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "$TZ",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/DATA/AppData/$AppID/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": 6052,
|
||||
"published_example": 6052,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "always",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "name: esphome\nservices:\n esphome:\n container_name: esphome\n deploy:\n resources:\n reservations:\n memory: 512M\n image: ghcr.io/esphome/esphome:latest\n restart: always\n ports:\n - target: 6052\n published: '6052'\n protocol: tcp\n volumes:\n - type: bind\n source: /DATA/AppData/$AppID/config\n target: /config\n environment:\n ESPHOME_DASHBOARD_USE_PING: 'false'\n TZ: $TZ\n network_mode: host\n privileged: false\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "esphome",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "esphome",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "esphome",
|
||||
"image": "ghcr.io/esphome/esphome:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"container_name": "esphome",
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "512M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"image": "ghcr.io/esphome/esphome:latest",
|
||||
"restart": "always",
|
||||
"ports": [
|
||||
{
|
||||
"target": 6052,
|
||||
"published": "6052",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/config",
|
||||
"target": "/config"
|
||||
}
|
||||
],
|
||||
"environment": {
|
||||
"ESPHOME_DASHBOARD_USE_PING": "false",
|
||||
"TZ": "$TZ"
|
||||
},
|
||||
"network_mode": "host",
|
||||
"privileged": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "esphome"
|
||||
},
|
||||
"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": "esphome-volume-0",
|
||||
"service": "esphome",
|
||||
"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": [
|
||||
"esphome"
|
||||
],
|
||||
"stop_order": [
|
||||
"esphome"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 6052,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"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": 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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"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,522 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-etherpad",
|
||||
"status": "laboratory-validated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Etherpad"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Real-time collaborative document editor"
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Etherpad is a real-time collaborative document editor where multiple people can edit the same pad simultaneously, with every change synchronized instantly and colour-coded per author.\nSelf-hosted, open source, and fully under your control, it is perfect for meeting notes, brainstorming, shared writing, and lightweight knowledge capture.\nIt ships with a built-in admin panel, a plugin ecosystem of 250+ add-ons, native DOCX/PDF/Markdown import & export, and multi-architecture container support (amd64 + arm64).\n\n**Main Features:**\n- Real-time collaborative editing with instant sync\n- Per-author colour coding for clear writing attribution\n- Built-in admin panel and a plugin ecosystem with 250+ add-ons\n- Native DOCX, PDF, and Markdown import & export\n- Open source, self-hosted deployment with amd64 and arm64 support\n\n**Learn More:**\n- [Etherpad Official Website](https://etherpad.org/)\n- [Etherpad GitHub](https://github.com/ether/etherpad)\n- [Etherpad Documentation](https://docs.etherpad.org/)\n"
|
||||
},
|
||||
"category": "documents",
|
||||
"category_label": "Documents & Notes",
|
||||
"author": "Etherpad Foundation",
|
||||
"developer": "Etherpad Foundation",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 9001,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://etherpad.org/",
|
||||
"documentation": null,
|
||||
"repository": "https://hub.docker.com/r/etherpad/etherpad",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "official",
|
||||
"repository": "https://hub.docker.com/r/etherpad/etherpad",
|
||||
"revision": "dcd7e324b25daf810d72ec2a7b0c6bc447ba2413bae1d5e733c0975d7a014ce8",
|
||||
"image_repository_url": "https://hub.docker.com/r/etherpad/etherpad",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "dcd7e324b25daf810d72ec2a7b0c6bc447ba2413bae1d5e733c0975d7a014ce8",
|
||||
"generated_at": "2026-09-13T15:34:58+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "etherpad",
|
||||
"container_name": "etherpad",
|
||||
"image": {
|
||||
"reference": "etherpad/etherpad:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "etherpad/etherpad",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "TITLE",
|
||||
"example": "Etherpad",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "DEFAULT_PAD_TEXT",
|
||||
"example": "Welcome to Etherpad on etherpad!\n\nThis pad text is synchronized as you type, so that everyone viewing this page sees the same text. This allows you to collaborate seamlessly on documents!\n\nGet involved with Etherpad at https://etherpad.org\n",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "ADMIN_PASSWORD",
|
||||
"example": "${GENERATED_ADMIN_PASSWORD}",
|
||||
"required": true,
|
||||
"sensitive": true,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "AUTHENTICATION_METHOD",
|
||||
"example": "apikey",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "DB_TYPE",
|
||||
"example": "dirty",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "DB_FILENAME",
|
||||
"example": "/opt/etherpad-lite/var/dirty.db",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "TRUST_PROXY",
|
||||
"example": "true",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "SHOW_SETTINGS_IN_ADMIN_PAGE",
|
||||
"example": "true",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "REQUIRE_AUTHENTICATION",
|
||||
"example": "false",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "REQUIRE_AUTHORIZATION",
|
||||
"example": "false",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/opt/etherpad-lite/var",
|
||||
"compose_source_example": "/DATA/AppData/$AppID/var",
|
||||
"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": 9001,
|
||||
"published_example": 9001,
|
||||
"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: etherpad\nservices:\n etherpad:\n image: etherpad/etherpad:latest\n container_name: etherpad\n deploy:\n resources:\n reservations:\n memory: 256M\n network_mode: bridge\n restart: unless-stopped\n ports:\n - target: 9001\n published: '9001'\n protocol: tcp\n volumes:\n - type: bind\n source: /DATA/AppData/$AppID/var\n target: /opt/etherpad-lite/var\n environment:\n TITLE: Etherpad\n DEFAULT_PAD_TEXT: 'Welcome to Etherpad on etherpad!\n\n\n This pad text is synchronized as you type, so that everyone viewing this page\n sees the same text. This allows you to collaborate seamlessly on documents!\n\n\n Get involved with Etherpad at https://etherpad.org\n\n '\n ADMIN_PASSWORD: ${GENERATED_ADMIN_PASSWORD}\n AUTHENTICATION_METHOD: apikey\n DB_TYPE: dirty\n DB_FILENAME: /opt/etherpad-lite/var/dirty.db\n TRUST_PROXY: 'true'\n SHOW_SETTINGS_IN_ADMIN_PAGE: 'true'\n REQUIRE_AUTHENTICATION: 'false'\n REQUIRE_AUTHORIZATION: 'false'\n healthcheck:\n test:\n - CMD\n - wget\n - -q\n - -O-\n - http://localhost:9001/health\n interval: 30s\n timeout: 10s\n retries: 3\n start_period: 30s\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "etherpad",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "etherpad",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "etherpad",
|
||||
"image": "etherpad/etherpad:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"image": "etherpad/etherpad:latest",
|
||||
"container_name": "etherpad",
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "256M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"network_mode": "bridge",
|
||||
"restart": "unless-stopped",
|
||||
"ports": [
|
||||
{
|
||||
"target": 9001,
|
||||
"published": "9001",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/var",
|
||||
"target": "/opt/etherpad-lite/var"
|
||||
}
|
||||
],
|
||||
"environment": {
|
||||
"TITLE": "Etherpad",
|
||||
"DEFAULT_PAD_TEXT": "Welcome to Etherpad on etherpad!\n\nThis pad text is synchronized as you type, so that everyone viewing this page sees the same text. This allows you to collaborate seamlessly on documents!\n\nGet involved with Etherpad at https://etherpad.org\n",
|
||||
"ADMIN_PASSWORD": "${GENERATED_ADMIN_PASSWORD}",
|
||||
"AUTHENTICATION_METHOD": "apikey",
|
||||
"DB_TYPE": "dirty",
|
||||
"DB_FILENAME": "/opt/etherpad-lite/var/dirty.db",
|
||||
"TRUST_PROXY": "true",
|
||||
"SHOW_SETTINGS_IN_ADMIN_PAGE": "true",
|
||||
"REQUIRE_AUTHENTICATION": "false",
|
||||
"REQUIRE_AUTHORIZATION": "false"
|
||||
},
|
||||
"healthcheck": {
|
||||
"test": [
|
||||
"CMD",
|
||||
"wget",
|
||||
"-q",
|
||||
"-O-",
|
||||
"http://localhost:9001/health"
|
||||
],
|
||||
"interval": "30s",
|
||||
"timeout": "10s",
|
||||
"retries": 3,
|
||||
"start_period": "30s"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "etherpad"
|
||||
},
|
||||
"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": "etherpad-volume-0",
|
||||
"service": "etherpad",
|
||||
"container_path": "/opt/etherpad-lite/var",
|
||||
"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": [
|
||||
"etherpad"
|
||||
],
|
||||
"stop_order": [
|
||||
"etherpad"
|
||||
],
|
||||
"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": "admin-password",
|
||||
"strategy": "generate-cryptographically-random-at-install",
|
||||
"bindings": [
|
||||
{
|
||||
"service": "etherpad",
|
||||
"environment_variable": "ADMIN_PASSWORD"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 9001,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"credentials": []
|
||||
},
|
||||
"proxmox": {
|
||||
"runtime": "native-oci-lxc",
|
||||
"technology_status": "proxmox-technology-preview",
|
||||
"defaults": {
|
||||
"unprivileged": true,
|
||||
"ostype": "auto-from-image",
|
||||
"cores": 2,
|
||||
"memory_mb": 256,
|
||||
"swap_mb": 512,
|
||||
"rootfs_size_gb": 8,
|
||||
"rootfs_storage": "local-lvm",
|
||||
"volume_storage": "local-lvm",
|
||||
"template_storage": "local",
|
||||
"bridge": "vmbr0",
|
||||
"ipv4": "dhcp",
|
||||
"firewall": true,
|
||||
"host_managed_network": true,
|
||||
"onboot": false,
|
||||
"features": [
|
||||
"nesting=1"
|
||||
],
|
||||
"shutdown_timeout_seconds": 30
|
||||
},
|
||||
"image_metadata_policy": {
|
||||
"entrypoint": "import-from-oci-image",
|
||||
"cmd": "import-from-oci-image",
|
||||
"environment": "import-image-env-then-apply-compose-overrides",
|
||||
"user": "import-from-oci-image",
|
||||
"working_dir": "import-from-oci-image",
|
||||
"stop_signal": "import-from-oci-image"
|
||||
},
|
||||
"installer_profile": {
|
||||
"startup_healthcheck": {
|
||||
"type": "http",
|
||||
"scheme": "http",
|
||||
"port": 9001,
|
||||
"path": "/health",
|
||||
"timeout_seconds": 120,
|
||||
"request_timeout_seconds": 10,
|
||||
"stability_seconds": 0,
|
||||
"verify_tls": true,
|
||||
"required": true,
|
||||
"source": "compose-healthcheck"
|
||||
}
|
||||
},
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"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-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": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"user",
|
||||
"volumes",
|
||||
"working_dir"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "Single-image definitions are installable when every declared Compose option has a native Proxmox translation. Multi-image and unsupported runtime features remain blocked until their orchestrator or mapping is available."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "passed-amd64",
|
||||
"service_health": "passed-amd64",
|
||||
"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,363 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-excalidraw",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Excalidraw"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Virtual whiteboard for sketching hand-drawn like diagrams"
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Excalidraw is a virtual hand-drawn style whiteboard platform supporting infinite canvas and end-to-end encrypted collaboration. An intuitive interface offers a hand-drawn experience, ideal for brainstorming, design sketches, or educational scenarios, meeting diverse creative needs.\n\nCore features include an infinite canvas whiteboard and end-to-end encrypted collaboration. Hand-drawn style with shape library support allows creating rich graphics, enhanced by image insertion capabilities. Dark mode improves user experience, catering to diverse users.\n\nIt provides export options including PNG, SVG, and clipboard for easy content sharing. Drawing capabilities cover rectangle, circle, diamond, arrow, line, free-draw, and eraser, with arrow-binding and labeled arrow support. Undo, redo, zoom, and panning functionalities optimize operations. With creativity and security at the core, the platform delivers a modern whiteboard design solution.\n\n**Key Features:**\n- Infinite canvas whiteboard supporting hand-drawn style\n- Shape library support for creating rich graphics\n- Image insertion capability\n- Dark mode\n- Export to PNG, SVG, and clipboard\n- Open format - export drawings as an `.excalidraw` json file\n- Wide range of tools - rectangle, circle, diamond, arrow, line, free-draw, eraser...\n- Arrow-binding & labeled arrows\n- Undo and redo\n- Zoom and panning support\n\n**Learn More:**\n- [Excalidraw Official Website](https://excalidraw.com/)\n- [Excalidraw GitHub](https://github.com/excalidraw/excalidraw)\n"
|
||||
},
|
||||
"category": "documents",
|
||||
"category_label": "Documents & Notes",
|
||||
"author": "excalidraw",
|
||||
"developer": "excalidraw",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 80,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://excalidraw.com/",
|
||||
"documentation": null,
|
||||
"repository": "https://hub.docker.com/r/excalidraw/excalidraw",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "official",
|
||||
"repository": "https://hub.docker.com/r/excalidraw/excalidraw",
|
||||
"revision": "0afa4bd5dd3a2dbe663626f420682ee5b92d696420a690a0beda6da90f0f07c6",
|
||||
"image_repository_url": "https://hub.docker.com/r/excalidraw/excalidraw",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "0afa4bd5dd3a2dbe663626f420682ee5b92d696420a690a0beda6da90f0f07c6",
|
||||
"generated_at": "2026-09-13T15:34:58+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "excalidraw",
|
||||
"container_name": "excalidraw",
|
||||
"image": {
|
||||
"reference": "excalidraw/excalidraw:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "excalidraw/excalidraw",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [],
|
||||
"volumes": [],
|
||||
"ports": [
|
||||
{
|
||||
"container_port": 80,
|
||||
"published_example": 17638,
|
||||
"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: excalidraw\nservices:\n excalidraw:\n image: excalidraw/excalidraw:latest\n container_name: excalidraw\n deploy:\n resources:\n reservations:\n memory: 256M\n restart: unless-stopped\n ports:\n - target: 80\n published: '17638'\n protocol: tcp\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "excalidraw",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "excalidraw",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "excalidraw",
|
||||
"image": "excalidraw/excalidraw:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"image": "excalidraw/excalidraw:latest",
|
||||
"container_name": "excalidraw",
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "256M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"restart": "unless-stopped",
|
||||
"ports": [
|
||||
{
|
||||
"target": 80,
|
||||
"published": "17638",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "excalidraw"
|
||||
},
|
||||
"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": [
|
||||
"excalidraw"
|
||||
],
|
||||
"stop_order": [
|
||||
"excalidraw"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 80,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"credentials": []
|
||||
},
|
||||
"proxmox": {
|
||||
"runtime": "native-oci-lxc",
|
||||
"technology_status": "proxmox-technology-preview",
|
||||
"defaults": {
|
||||
"unprivileged": true,
|
||||
"ostype": "auto-from-image",
|
||||
"cores": 2,
|
||||
"memory_mb": 256,
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"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,276 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-faster-whisper",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Faster Whisper"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Faster-whisper is a reimplementation of OpenAI's Whisper model using CTranslate2, which is a fast inference engine for Transformer models. This container provides a Wyoming protocol server for faster-whisper."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Faster-whisper is a reimplementation of OpenAI's Whisper model using CTranslate2, which is a fast inference engine for Transformer models. This container provides a Wyoming protocol server for faster-whisper."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/faster-whisper-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/faster-whisper-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 10300,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://github.com/SYSTRAN/faster-whisper",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-faster-whisper/",
|
||||
"repository": "https://github.com/linuxserver/docker-faster-whisper",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-08-16",
|
||||
"note": "Rebase to Ubuntu Resolute."
|
||||
},
|
||||
{
|
||||
"date": "2026-01-26",
|
||||
"note": "Default to `auto` for model and language if not set."
|
||||
},
|
||||
{
|
||||
"date": "2025-08-20",
|
||||
"note": "Add gpu-legacy branch for pre-Turing cards."
|
||||
},
|
||||
{
|
||||
"date": "2025-08-10",
|
||||
"note": "Add support for local-only mode."
|
||||
},
|
||||
{
|
||||
"date": "2024-12-30",
|
||||
"note": "Add arm64 support for non-GPU builds."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-08-16"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-faster-whisper",
|
||||
"default_branch": "main",
|
||||
"revision": "f506df5f04542fdce45f29b2256628ca70d69c68",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-faster-whisper/f506df5f04542fdce45f29b2256628ca70d69c68/README.md",
|
||||
"readme_pushed_at": "2026-09-12T01:03:07Z",
|
||||
"compose_sha256": "ce7ac145487ea70281c626c3962c2d9e22021250b43f183f73bf27cb5aab414b",
|
||||
"generated_at": "2026-09-12T14:37:26+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "faster-whisper",
|
||||
"container_name": "faster-whisper",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/faster-whisper:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/faster-whisper",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "DEBUG",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "LOCAL_ONLY",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "WHISPER_BEAM",
|
||||
"example": "1",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "WHISPER_LANG",
|
||||
"example": "auto",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "WHISPER_MODEL",
|
||||
"example": "auto",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/faster-whisper/data",
|
||||
"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": 10300,
|
||||
"published_example": 10300,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n faster-whisper:\n image: lscr.io/linuxserver/faster-whisper:latest\n container_name: faster-whisper\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n - DEBUG= #optional\n - LOCAL_ONLY= #optional\n - WHISPER_BEAM=1 #optional\n - WHISPER_LANG=auto #optional\n - WHISPER_MODEL=auto #optional\n volumes:\n - /path/to/faster-whisper/data:/config\n ports:\n - 10300:10300\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 10300,
|
||||
"path": "/",
|
||||
"source": "compose-first-tcp-port-fallback"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,373 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-ferdium",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Ferdium"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Ferdium is a desktop app that helps you organize how you use your favourite apps by combining them into one application."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Ferdium is a desktop app that helps you organize how you use your favourite apps by combining them into one application."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/ferdium-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/ferdium-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://ferdium.org/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-ferdium/",
|
||||
"repository": "https://github.com/linuxserver/docker-ferdium",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-04-03",
|
||||
"note": "Make Wayland default disable with PIXELFLUX_WAYLAND=false."
|
||||
},
|
||||
{
|
||||
"date": "2026-03-21",
|
||||
"note": "Use Wayland ozone platform fixes scaling and acceleration."
|
||||
},
|
||||
{
|
||||
"date": "2025-12-28",
|
||||
"note": "Add Wayland init logic."
|
||||
},
|
||||
{
|
||||
"date": "2025-09-22",
|
||||
"note": "Rebase to Debian Trixie."
|
||||
},
|
||||
{
|
||||
"date": "2025-07-12",
|
||||
"note": "Rebase to Selkies, HTTPS IS NOW REQUIRED."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-04-03"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-ferdium",
|
||||
"default_branch": "master",
|
||||
"revision": "7b0ba3f02d2a7a410933845427c5ef6bfa0e196e",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-ferdium/7b0ba3f02d2a7a410933845427c5ef6bfa0e196e/README.md",
|
||||
"readme_pushed_at": "2026-09-07T20:24:53Z",
|
||||
"compose_sha256": "b7cbb69404319fa9743f1c71cd8f8ffa1d3b5050f386442d197921c0a46568c4",
|
||||
"generated_at": "2026-09-12T14:37:26+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "ferdium",
|
||||
"container_name": "ferdium",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/ferdium:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/ferdium",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "LC_ALL",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "upstream-documentation",
|
||||
"prompt": "Language/locale (e.g. es_ES.UTF-8; translation of every application is not guaranteed)"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/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": 3000,
|
||||
"published_example": 3000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 3001,
|
||||
"published_example": 3001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n ferdium:\n image: lscr.io/linuxserver/ferdium:latest\n container_name: ferdium\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/config:/config\n ports:\n - 3000:3000\n - 3001:3001\n shm_size: \"1gb\"\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
}
|
||||
],
|
||||
"installer_profile": {
|
||||
"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"
|
||||
]
|
||||
},
|
||||
{
|
||||
"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"
|
||||
]
|
||||
}
|
||||
],
|
||||
"selkies": {
|
||||
"base": "FROM ghcr.io/linuxserver/baseimage-selkies:debiantrixie",
|
||||
"dockerfile_url": "https://raw.githubusercontent.com/linuxserver/docker-ferdium/master/Dockerfile",
|
||||
"dockerfile_sha256": "c47d21332c5d5516c76e7593905690c85c42a5d58aabfe0d0e099161b03b4755",
|
||||
"reviewed_on": "2026-09-16",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/",
|
||||
"nvidia": "not-offered-until-specific-host-and-image-validation",
|
||||
"validation": "profile-generated; real streaming workload pending"
|
||||
},
|
||||
"optional_devices": [],
|
||||
"hardware_acceleration": {
|
||||
"prompt": "Selkies desktop and streaming acceleration",
|
||||
"default": "none",
|
||||
"profiles": [
|
||||
{
|
||||
"id": "none",
|
||||
"label": "No GPU (CPU)",
|
||||
"device_requests": [],
|
||||
"environment": [
|
||||
{
|
||||
"name": "AUTO_GPU",
|
||||
"value": "false"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "vaapi",
|
||||
"label": "Intel/AMD (streaming rendering and encoding)",
|
||||
"device_requests": [
|
||||
{
|
||||
"id": "selkies-render",
|
||||
"kind": "character-device",
|
||||
"path_prompt": "Intel/AMD render node",
|
||||
"host_path_default": "/dev/dri/renderD128",
|
||||
"container_path_strategy": "same-as-host",
|
||||
"mode": "0660",
|
||||
"deny_write": false,
|
||||
"gid_strategy": "host-device-gid",
|
||||
"drm_vendor_ids": [
|
||||
"0x8086",
|
||||
"0x1002"
|
||||
]
|
||||
}
|
||||
],
|
||||
"environment": [
|
||||
{
|
||||
"name": "PIXELFLUX_WAYLAND",
|
||||
"value": "true"
|
||||
},
|
||||
{
|
||||
"name": "AUTO_GPU",
|
||||
"value": "false"
|
||||
}
|
||||
],
|
||||
"environment_from_devices": {
|
||||
"DRINODE": [
|
||||
"selkies-render"
|
||||
],
|
||||
"DRI_NODE": [
|
||||
"selkies-render"
|
||||
],
|
||||
"ATTACHED_DEVICES_PERMS": [
|
||||
"selkies-render"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"gpu_validation": {
|
||||
"device_inventory": "host-sysfs-and-stat",
|
||||
"application_acceleration": "requires-workload-test",
|
||||
"tone_mapping": "not-implied-by-device-access"
|
||||
},
|
||||
"device_permissions": {
|
||||
"strategy": "linuxserver-native-init",
|
||||
"service_user": "abc",
|
||||
"environment": "ATTACHED_DEVICES_PERMS",
|
||||
"paths": "all-resolved-selected-character-devices"
|
||||
}
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"shm_size",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,390 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-filebrowser-quantum",
|
||||
"status": "laboratory-validated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "FileBrowser Quantum"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "FileBrowser Quantum"
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Official image with managed persistent configuration and selectable content storage. Validated on amd64: clean install, authenticated login, same-digest recreation and interrupted-candidate recovery. Cross-release migration and arm64 runtime not tested."
|
||||
},
|
||||
"category": "tools",
|
||||
"category_label": "Tools",
|
||||
"author": "gtsteffaniak",
|
||||
"developer": "gtsteffaniak",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 80,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://github.com/gtsteffaniak/filebrowser",
|
||||
"documentation": "https://github.com/gtsteffaniak/filebrowser",
|
||||
"repository": "https://github.com/gtsteffaniak/filebrowser",
|
||||
"tips": [
|
||||
"Official image with managed persistent configuration and selectable content storage. Validated on amd64: clean install, authenticated login, same-digest recreation and interrupted-candidate recovery. Cross-release migration and arm64 runtime not tested."
|
||||
],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-09-16",
|
||||
"hidden": false
|
||||
},
|
||||
"source": {
|
||||
"provider": "gtsteffaniak",
|
||||
"repository": "https://github.com/gtsteffaniak/filebrowser",
|
||||
"default_branch": "main",
|
||||
"revision": "fa58eac9c06d769597652712ef9f093971a916d1",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/gtsteffaniak/filebrowser/fa58eac9c06d769597652712ef9f093971a916d1/README.md",
|
||||
"image_repository_url": "https://hub.docker.com/r/gtstef/filebrowser",
|
||||
"compose_sha256": "1bc09f5ad7bf878a96e53861e52e6274ebc335ed63933b7e195dab0321ce5cdd",
|
||||
"generated_at": "2026-09-16T22:00:00+02:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "filebrowser-quantum",
|
||||
"container_name": "filebrowser-quantum",
|
||||
"image": {
|
||||
"reference": "gtstef/filebrowser:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "gtstef/filebrowser",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "FILEBROWSER_ADMIN_PASSWORD",
|
||||
"example": "",
|
||||
"required": true,
|
||||
"sensitive": true,
|
||||
"source": "upstream-documentation",
|
||||
"prompt_user": true
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "config",
|
||||
"container_path": "/home/filebrowser/data",
|
||||
"compose_source_example": "config-data",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 4
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "files",
|
||||
"container_path": "/folder",
|
||||
"compose_source_example": "/mnt/oci-shared/files",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "host-bind",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 32
|
||||
}
|
||||
}
|
||||
],
|
||||
"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": "{\n \"services\": {\n \"filebrowser-quantum\": {\n \"image\": \"gtstef/filebrowser:latest\",\n \"volumes\": [\n \"config-data:/home/filebrowser/data\",\n \"/mnt/oci-shared/files:/folder\"\n ],\n \"ports\": [\n \"80:80\"\n ],\n \"environment\": {\n \"FILEBROWSER_ADMIN_PASSWORD\": \"\"\n },\n \"restart\": \"unless-stopped\"\n }\n }\n}"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "mkvtoolnix",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "mkvtoolnix",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "mkvtoolnix",
|
||||
"image": "jlesage/mkvtoolnix:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"image": "jlesage/mkvtoolnix:latest",
|
||||
"ports": [
|
||||
"5800:5800"
|
||||
],
|
||||
"environment": {
|
||||
"USER_ID": "1000",
|
||||
"GROUP_ID": "1000",
|
||||
"TZ": "Europe/Madrid"
|
||||
},
|
||||
"volumes": [
|
||||
"mkvtoolnix-config:/config",
|
||||
"/mnt/oci-shared/media:/storage"
|
||||
],
|
||||
"restart": "unless-stopped"
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {},
|
||||
"networking": {
|
||||
"frontend": "selected-proxmox-bridge",
|
||||
"private_required": false,
|
||||
"private_creation": "not-required",
|
||||
"private_address_allocation": "not-required",
|
||||
"service_discovery": "dedicated-lxc-address",
|
||||
"dependency_external_access": "not-applicable",
|
||||
"prompt_user_for_private_network": false
|
||||
},
|
||||
"storage": [
|
||||
{
|
||||
"id": "mkvtoolnix-config",
|
||||
"service": "mkvtoolnix",
|
||||
"container_path": "/config",
|
||||
"mode": "user-selectable",
|
||||
"user_selectable": true,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"default": "managed-volume",
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "mkvtoolnix-storage",
|
||||
"service": "mkvtoolnix",
|
||||
"container_path": "/storage",
|
||||
"mode": "user-selectable",
|
||||
"user_selectable": true,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": true,
|
||||
"default": "host-bind",
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
]
|
||||
}
|
||||
],
|
||||
"orchestration": {
|
||||
"reserve_vmids_atomically": 1,
|
||||
"start_order": [
|
||||
"mkvtoolnix"
|
||||
],
|
||||
"stop_order": [
|
||||
"mkvtoolnix"
|
||||
],
|
||||
"dependency_readiness": "mandatory-http-first-start-healthcheck",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-external-host-data"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"image_digest_resolution",
|
||||
"managed_volume_preparation"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"proxmox": {
|
||||
"runtime": "native-oci-lxc",
|
||||
"technology_status": "proxmox-technology-preview",
|
||||
"catalog": {
|
||||
"replaces_discovered_ids": []
|
||||
},
|
||||
"defaults": {
|
||||
"unprivileged": true,
|
||||
"ostype": "auto-from-image",
|
||||
"cores": 2,
|
||||
"memory_mb": 2048,
|
||||
"swap_mb": 512,
|
||||
"rootfs_size_gb": 8,
|
||||
"rootfs_storage": "local-lvm",
|
||||
"volume_storage": "local-lvm",
|
||||
"template_storage": "local",
|
||||
"bridge": "vmbr0",
|
||||
"ipv4": "dhcp",
|
||||
"firewall": true,
|
||||
"host_managed_network": true,
|
||||
"onboot": false,
|
||||
"features": [
|
||||
"nesting=1"
|
||||
],
|
||||
"shutdown_timeout_seconds": 30
|
||||
},
|
||||
"image_metadata_policy": {
|
||||
"entrypoint": "import-from-oci-image",
|
||||
"cmd": "import-from-oci-image",
|
||||
"environment": "import-image-env-then-apply-compose-overrides",
|
||||
"user": "import-from-oci-image",
|
||||
"working_dir": "import-from-oci-image",
|
||||
"stop_signal": "import-from-oci-image"
|
||||
},
|
||||
"adaptations": [
|
||||
{
|
||||
"id": "native-persistent-volumes",
|
||||
"upstream_behavior": "Docker bind mounts persistent directories into the image.",
|
||||
"native_lxc_behavior": "ProxMenux attaches native Proxmox volumes or explicit host bind mounts at the same container paths.",
|
||||
"reason": "Preserve the official image contract while making persistence visible to Proxmox backup policy.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "passed-amd64-install-recreate-recovery"
|
||||
},
|
||||
{
|
||||
"id": "native-device-passthrough",
|
||||
"upstream_behavior": "Docker exposes explicitly selected host devices to the container.",
|
||||
"native_lxc_behavior": "ProxMenux maps each selected device with the native Proxmox dev resource.",
|
||||
"reason": "The OCI process runs directly inside an LXC rather than through Docker.",
|
||||
"behavioral_impact": "Only devices explicitly selected by the user are exposed.",
|
||||
"validation": "not-required"
|
||||
}
|
||||
],
|
||||
"installer_profile": {
|
||||
"volume_owner": {
|
||||
"uid": 1000,
|
||||
"gid": 1000
|
||||
},
|
||||
"volume_preparations": [
|
||||
{
|
||||
"container_path": "/home/filebrowser/data",
|
||||
"remove_lost_found": true,
|
||||
"owner_strategy": "mapped-application-user",
|
||||
"only_when_mount_type": "managed-volume"
|
||||
},
|
||||
{
|
||||
"container_path": "/folder",
|
||||
"remove_lost_found": true,
|
||||
"owner_strategy": "mapped-application-user",
|
||||
"only_when_mount_type": "managed-volume"
|
||||
}
|
||||
],
|
||||
"security": {
|
||||
"sysctls": [
|
||||
{
|
||||
"name": "net.ipv4.ip_unprivileged_port_start",
|
||||
"value": "0"
|
||||
}
|
||||
]
|
||||
},
|
||||
"generated_files": [
|
||||
{
|
||||
"container_path": "/home/filebrowser/data/config.yaml",
|
||||
"mode": "0644",
|
||||
"owner": "mapped-application-user",
|
||||
"only_if_missing": true,
|
||||
"content": "server:\n port: 80\n cacheDir: /home/filebrowser/data/tmp\n sources:\n - path: /folder\n config:\n defaultEnabled: true\nauth:\n adminUsername: admin\n"
|
||||
}
|
||||
],
|
||||
"startup_healthcheck": {
|
||||
"scheme": "http",
|
||||
"port": 80,
|
||||
"path": "/health",
|
||||
"timeout_seconds": 300,
|
||||
"request_timeout_seconds": 10,
|
||||
"stability_seconds": 4,
|
||||
"verify_tls": false
|
||||
}
|
||||
},
|
||||
"security_profile": {
|
||||
"requires_privileged_lxc": false,
|
||||
"source_requests_privileged_lxc": false,
|
||||
"optional_privileged_lxc": false,
|
||||
"requires_host_pid_namespace": false,
|
||||
"source_requests_relaxed_confinement": false,
|
||||
"requires_relaxed_confinement": false,
|
||||
"optional_relaxed_confinement": false,
|
||||
"risk_level": "normal",
|
||||
"confirmation_required": false,
|
||||
"warning": "No security relaxation is required for the reviewed profile."
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": true,
|
||||
"supported_compose_keys": [
|
||||
"devices",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "Official image with managed persistent configuration and selectable content storage. Validated on amd64: clean install, authenticated login, same-digest recreation and interrupted-candidate recovery. Cross-release migration and arm64 runtime not tested."
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 80,
|
||||
"path": "/",
|
||||
"source": "https://github.com/gtsteffaniak/filebrowser"
|
||||
}
|
||||
],
|
||||
"credentials": [
|
||||
{
|
||||
"label": "FileBrowser Quantum (new installation)",
|
||||
"type": "configured-or-installer-generated",
|
||||
"username": "admin",
|
||||
"password": null,
|
||||
"password_environment": "FILEBROWSER_ADMIN_PASSWORD",
|
||||
"change_required": false,
|
||||
"source": "https://filebrowserquantum.com/en/docs/reference/cli/"
|
||||
}
|
||||
]
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "passed-amd64",
|
||||
"service_health": "passed-amd64",
|
||||
"restart_persistence": "passed-through-recreation-amd64",
|
||||
"backup_restore": "passed-managed-configuration-amd64",
|
||||
"update_preserves_data": "passed-same-digest-recreation-amd64",
|
||||
"cross_release_upgrade": "not-tested",
|
||||
"evidence": "docs/lab/new-images-validation-20260918.json"
|
||||
},
|
||||
"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-readme-revision-and-resolved-latest-image-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,427 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-filedrop",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "FileDrop"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "FileDrop is a free, open source file sharing service"
|
||||
},
|
||||
"description": {
|
||||
"en_US": "FileDrop is a self-hosted file sharing service that allows you to easily share files with family, friends, or colleagues. It's been designed to be easy to use and light on resources.\n"
|
||||
},
|
||||
"category": "productivity",
|
||||
"category_label": "Productivity & Workflows",
|
||||
"author": "No\u00e9 Favier (noe.favier@outlook.com)",
|
||||
"developer": "No\u00e9 Favier (noe.favier@outlook.com)",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 8000,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "",
|
||||
"documentation": null,
|
||||
"repository": "https://hub.docker.com/r/noecl/filedrop",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "noecl",
|
||||
"repository": "https://hub.docker.com/r/noecl/filedrop",
|
||||
"revision": "98c8ff69048ddd921d74d3be80c5e67fdb81c25f6a267355c9a8da220fa8ee0e",
|
||||
"image_repository_url": "https://hub.docker.com/r/noecl/filedrop",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "98c8ff69048ddd921d74d3be80c5e67fdb81c25f6a267355c9a8da220fa8ee0e",
|
||||
"generated_at": "2026-09-13T15:34:58+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "filedrop",
|
||||
"container_name": "filedrop",
|
||||
"image": {
|
||||
"reference": "noecl/filedrop:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "noecl/filedrop",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "$PGID",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "$PUID",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "$TZ",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/var/file_drop_files",
|
||||
"compose_source_example": "/DATA/AppData/filedrop/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": 8000,
|
||||
"published_example": 8000,
|
||||
"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: filedrop\nservices:\n filedrop:\n environment:\n PGID: $PGID\n PUID: $PUID\n TZ: $TZ\n image: noecl/filedrop:latest\n deploy:\n resources:\n reservations:\n memory: 2048M\n restart: unless-stopped\n ports:\n - target: 8000\n published: '8000'\n protocol: tcp\n volumes:\n - type: bind\n source: /DATA/AppData/filedrop/data\n target: /var/file_drop_files\n container_name: filedrop\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "filedrop",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "filedrop",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "filedrop",
|
||||
"image": "noecl/filedrop:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"environment": {
|
||||
"PGID": "$PGID",
|
||||
"PUID": "$PUID",
|
||||
"TZ": "$TZ"
|
||||
},
|
||||
"image": "noecl/filedrop:latest",
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "2048M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"restart": "unless-stopped",
|
||||
"ports": [
|
||||
{
|
||||
"target": 8000,
|
||||
"published": "8000",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/filedrop/data",
|
||||
"target": "/var/file_drop_files"
|
||||
}
|
||||
],
|
||||
"container_name": "filedrop"
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "filedrop"
|
||||
},
|
||||
"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": "filedrop-volume-0",
|
||||
"service": "filedrop",
|
||||
"container_path": "/var/file_drop_files",
|
||||
"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": [
|
||||
"filedrop"
|
||||
],
|
||||
"stop_order": [
|
||||
"filedrop"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 8000,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"credentials": []
|
||||
},
|
||||
"proxmox": {
|
||||
"runtime": "native-oci-lxc",
|
||||
"technology_status": "proxmox-technology-preview",
|
||||
"defaults": {
|
||||
"unprivileged": true,
|
||||
"ostype": "auto-from-image",
|
||||
"cores": 2,
|
||||
"memory_mb": 2048,
|
||||
"swap_mb": 512,
|
||||
"rootfs_size_gb": 8,
|
||||
"rootfs_storage": "local-lvm",
|
||||
"volume_storage": "local-lvm",
|
||||
"template_storage": "local",
|
||||
"bridge": "vmbr0",
|
||||
"ipv4": "dhcp",
|
||||
"firewall": true,
|
||||
"host_managed_network": true,
|
||||
"onboot": false,
|
||||
"features": [
|
||||
"nesting=1"
|
||||
],
|
||||
"shutdown_timeout_seconds": 30
|
||||
},
|
||||
"image_metadata_policy": {
|
||||
"entrypoint": "import-from-oci-image",
|
||||
"cmd": "import-from-oci-image",
|
||||
"environment": "import-image-env-then-apply-compose-overrides",
|
||||
"user": "import-from-oci-image",
|
||||
"working_dir": "import-from-oci-image",
|
||||
"stop_signal": "import-from-oci-image"
|
||||
},
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"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,632 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-fileflows",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "FileFlows"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "File processing made easy!"
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Save storage space with efficient file processing.\n\nFileFlows lets you monitor and process any file type with custom flows. Videos, audio, images, archives, comics, eBooks\u2014you name it!\n"
|
||||
},
|
||||
"category": "media",
|
||||
"category_label": "Media & Streaming",
|
||||
"author": "FileFlows",
|
||||
"developer": "FileFlows",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 5000,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://fileflows.com/",
|
||||
"documentation": null,
|
||||
"repository": "https://hub.docker.com/r/revenz/fileflows",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "revenz",
|
||||
"repository": "https://hub.docker.com/r/revenz/fileflows",
|
||||
"revision": "59ca91536e4ddd94579fc78e432226f1d03651e0d289108b3482ac9da729c628",
|
||||
"image_repository_url": "https://hub.docker.com/r/revenz/fileflows",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "59ca91536e4ddd94579fc78e432226f1d03651e0d289108b3482ac9da729c628",
|
||||
"generated_at": "2026-09-13T15:34:58+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "fileflows",
|
||||
"container_name": "fileflows",
|
||||
"image": {
|
||||
"reference": "revenz/fileflows:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "revenz/fileflows",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "$PGID",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "$PUID",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "$TZ",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/app/Data",
|
||||
"compose_source_example": "/DATA/AppData/$AppID/data",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-1",
|
||||
"container_path": "/app/Logs",
|
||||
"compose_source_example": "/DATA/AppData/$AppID/logs",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-2",
|
||||
"container_path": "/app/common",
|
||||
"compose_source_example": "/DATA/AppData/$AppID/common",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-3",
|
||||
"container_path": "/temp",
|
||||
"compose_source_example": "/DATA/AppData/$AppID/temp",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-4",
|
||||
"container_path": "/Media",
|
||||
"compose_source_example": "/DATA/Media",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-5",
|
||||
"container_path": "/var/run/docker.sock",
|
||||
"compose_source_example": "/var/run/docker.sock",
|
||||
"read_only": false,
|
||||
"required": false,
|
||||
"installation_choice": [
|
||||
"host-bind",
|
||||
"skip"
|
||||
],
|
||||
"default": "skip",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
}
|
||||
],
|
||||
"ports": [
|
||||
{
|
||||
"container_port": 5000,
|
||||
"published_example": 19200,
|
||||
"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: fileflows\nservices:\n fileflows:\n container_name: fileflows\n devices:\n - /dev/dri:/dev/dri\n environment:\n PGID: $PGID\n PUID: $PUID\n TZ: $TZ\n hostname: fileflows\n image: revenz/fileflows:latest\n restart: unless-stopped\n ports:\n - target: 5000\n published: '19200'\n protocol: tcp\n network_mode: bridge\n volumes:\n - type: bind\n source: /DATA/AppData/$AppID/data\n target: /app/Data\n - type: bind\n source: /DATA/AppData/$AppID/logs\n target: /app/Logs\n - type: bind\n source: /DATA/AppData/$AppID/common\n target: /app/common\n - type: bind\n source: /DATA/AppData/$AppID/temp\n target: /temp\n - type: bind\n source: /DATA/Media\n target: /Media\n - type: bind\n source: /var/run/docker.sock\n target: /var/run/docker.sock\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "fileflows",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "fileflows",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "fileflows",
|
||||
"image": "revenz/fileflows:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"container_name": "fileflows",
|
||||
"devices": [
|
||||
"/dev/dri:/dev/dri"
|
||||
],
|
||||
"environment": {
|
||||
"PGID": "$PGID",
|
||||
"PUID": "$PUID",
|
||||
"TZ": "$TZ"
|
||||
},
|
||||
"hostname": "fileflows",
|
||||
"image": "revenz/fileflows:latest",
|
||||
"restart": "unless-stopped",
|
||||
"ports": [
|
||||
{
|
||||
"target": 5000,
|
||||
"published": "19200",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"network_mode": "bridge",
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/data",
|
||||
"target": "/app/Data"
|
||||
},
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/logs",
|
||||
"target": "/app/Logs"
|
||||
},
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/common",
|
||||
"target": "/app/common"
|
||||
},
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/$AppID/temp",
|
||||
"target": "/temp"
|
||||
},
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/Media",
|
||||
"target": "/Media"
|
||||
},
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/var/run/docker.sock",
|
||||
"target": "/var/run/docker.sock"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "fileflows"
|
||||
},
|
||||
"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": "fileflows-volume-0",
|
||||
"service": "fileflows",
|
||||
"container_path": "/app/Data",
|
||||
"mode": "managed-volume",
|
||||
"user_selectable": false,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"source_path": null,
|
||||
"source_path_prompt": null
|
||||
},
|
||||
{
|
||||
"id": "fileflows-volume-1",
|
||||
"service": "fileflows",
|
||||
"container_path": "/app/Logs",
|
||||
"mode": "managed-volume",
|
||||
"user_selectable": false,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"source_path": null,
|
||||
"source_path_prompt": null
|
||||
},
|
||||
{
|
||||
"id": "fileflows-volume-2",
|
||||
"service": "fileflows",
|
||||
"container_path": "/app/common",
|
||||
"mode": "managed-volume",
|
||||
"user_selectable": false,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"source_path": null,
|
||||
"source_path_prompt": null
|
||||
},
|
||||
{
|
||||
"id": "fileflows-volume-3",
|
||||
"service": "fileflows",
|
||||
"container_path": "/temp",
|
||||
"mode": "managed-volume",
|
||||
"user_selectable": false,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"source_path": null,
|
||||
"source_path_prompt": null
|
||||
},
|
||||
{
|
||||
"id": "fileflows-volume-4",
|
||||
"service": "fileflows",
|
||||
"container_path": "/Media",
|
||||
"mode": "host-bind",
|
||||
"user_selectable": true,
|
||||
"backup": false,
|
||||
"shared_with_other_lxc": true,
|
||||
"source_path": null,
|
||||
"source_path_prompt": "Host directory for fileflows:/Media"
|
||||
},
|
||||
{
|
||||
"id": "fileflows-volume-5",
|
||||
"service": "fileflows",
|
||||
"container_path": "/var/run/docker.sock",
|
||||
"mode": "runtime-bind",
|
||||
"user_selectable": false,
|
||||
"backup": false,
|
||||
"shared_with_other_lxc": false,
|
||||
"source_path": null,
|
||||
"source_path_prompt": null
|
||||
}
|
||||
],
|
||||
"orchestration": {
|
||||
"reserve_vmids_atomically": 1,
|
||||
"start_order": [
|
||||
"fileflows"
|
||||
],
|
||||
"stop_order": [
|
||||
"fileflows"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 5000,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"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"
|
||||
},
|
||||
"installer_profile": {
|
||||
"runtime": {
|
||||
"hostname": "fileflows"
|
||||
},
|
||||
"hardware_acceleration": {
|
||||
"prompt": "Hardware acceleration for FileFlows",
|
||||
"default": "none",
|
||||
"profiles": [
|
||||
{
|
||||
"id": "none",
|
||||
"label": "No acceleration (CPU)",
|
||||
"device_requests": []
|
||||
},
|
||||
{
|
||||
"id": "vaapi",
|
||||
"label": "Intel/AMD (VA-API)",
|
||||
"device_requests": [
|
||||
{
|
||||
"id": "vaapi-render",
|
||||
"kind": "character-device",
|
||||
"purpose": "vaapi",
|
||||
"path_prompt": "GPU render device",
|
||||
"host_path_default": "/dev/dri/renderD128",
|
||||
"container_path_strategy": "same-as-host",
|
||||
"mode": "0660",
|
||||
"deny_write": false,
|
||||
"gid_strategy": "host-device-gid"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"gpu_validation": {
|
||||
"device_inventory": "host-sysfs-and-stat",
|
||||
"application_acceleration": "requires-workload-test",
|
||||
"tone_mapping": "not-implied-by-device-access"
|
||||
}
|
||||
},
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"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"
|
||||
}
|
||||
],
|
||||
"deployment_profile": {
|
||||
"variant": "hardware-selectable",
|
||||
"gpu_passthrough": "installer-selection"
|
||||
},
|
||||
"catalog": {
|
||||
"replaces_discovered_ids": [
|
||||
"fileflows"
|
||||
]
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"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,373 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-filezilla",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Filezilla"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "FIleZilla Client is a fast and reliable cross-platform FTP, FTPS and SFTP client with lots of useful features and an intuitive graphical user interface."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "FIleZilla Client is a fast and reliable cross-platform FTP, FTPS and SFTP client with lots of useful features and an intuitive graphical user interface."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/filezilla-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/filezilla-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://filezilla-project.org/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-filezilla/",
|
||||
"repository": "https://github.com/linuxserver/docker-filezilla",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-05-20",
|
||||
"note": "Rebase to Ubuntu Resolute."
|
||||
},
|
||||
{
|
||||
"date": "2026-04-03",
|
||||
"note": "Make Wayland default disable with PIXELFLUX_WAYLAND=false."
|
||||
},
|
||||
{
|
||||
"date": "2025-12-28",
|
||||
"note": "Add Wayland init logic, rebase to Alpine 3.23."
|
||||
},
|
||||
{
|
||||
"date": "2025-07-26",
|
||||
"note": "Rebase to Selkies and Alpine 3.22, HTTPS IS NOW REQUIRED."
|
||||
},
|
||||
{
|
||||
"date": "2024-12-06",
|
||||
"note": "Rebase to Alpine 3.21."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-05-20"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-filezilla",
|
||||
"default_branch": "master",
|
||||
"revision": "11e131023ecaea3686fccd65ddc98a7af16abeb5",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-filezilla/11e131023ecaea3686fccd65ddc98a7af16abeb5/README.md",
|
||||
"readme_pushed_at": "2026-09-07T22:33:52Z",
|
||||
"compose_sha256": "ff0ff1bd8313ef50207b9854f58e3398748b0059a4ac2831c4127c06a5d5a10d",
|
||||
"generated_at": "2026-09-12T14:37:26+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "filezilla",
|
||||
"container_name": "filezilla",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/filezilla:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/filezilla",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "LC_ALL",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "upstream-documentation",
|
||||
"prompt": "Language/locale (e.g. es_ES.UTF-8; translation of every application is not guaranteed)"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/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": 3000,
|
||||
"published_example": 3000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 3001,
|
||||
"published_example": 3001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n filezilla:\n image: lscr.io/linuxserver/filezilla:latest\n container_name: filezilla\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/config:/config\n ports:\n - 3000:3000\n - 3001:3001\n shm_size: \"1gb\"\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
}
|
||||
],
|
||||
"installer_profile": {
|
||||
"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"
|
||||
]
|
||||
},
|
||||
{
|
||||
"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"
|
||||
]
|
||||
}
|
||||
],
|
||||
"selkies": {
|
||||
"base": "FROM ghcr.io/linuxserver/baseimage-selkies:ubunturesolute",
|
||||
"dockerfile_url": "https://raw.githubusercontent.com/linuxserver/docker-filezilla/master/Dockerfile",
|
||||
"dockerfile_sha256": "57086f8b98f9470374b0c2a5144e4fe931db0d35efa9c81dc65b2066d5cc3982",
|
||||
"reviewed_on": "2026-09-16",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/",
|
||||
"nvidia": "not-offered-until-specific-host-and-image-validation",
|
||||
"validation": "profile-generated; real streaming workload pending"
|
||||
},
|
||||
"optional_devices": [],
|
||||
"hardware_acceleration": {
|
||||
"prompt": "Selkies desktop and streaming acceleration",
|
||||
"default": "none",
|
||||
"profiles": [
|
||||
{
|
||||
"id": "none",
|
||||
"label": "No GPU (CPU)",
|
||||
"device_requests": [],
|
||||
"environment": [
|
||||
{
|
||||
"name": "AUTO_GPU",
|
||||
"value": "false"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "vaapi",
|
||||
"label": "Intel/AMD (streaming rendering and encoding)",
|
||||
"device_requests": [
|
||||
{
|
||||
"id": "selkies-render",
|
||||
"kind": "character-device",
|
||||
"path_prompt": "Intel/AMD render node",
|
||||
"host_path_default": "/dev/dri/renderD128",
|
||||
"container_path_strategy": "same-as-host",
|
||||
"mode": "0660",
|
||||
"deny_write": false,
|
||||
"gid_strategy": "host-device-gid",
|
||||
"drm_vendor_ids": [
|
||||
"0x8086",
|
||||
"0x1002"
|
||||
]
|
||||
}
|
||||
],
|
||||
"environment": [
|
||||
{
|
||||
"name": "PIXELFLUX_WAYLAND",
|
||||
"value": "true"
|
||||
},
|
||||
{
|
||||
"name": "AUTO_GPU",
|
||||
"value": "false"
|
||||
}
|
||||
],
|
||||
"environment_from_devices": {
|
||||
"DRINODE": [
|
||||
"selkies-render"
|
||||
],
|
||||
"DRI_NODE": [
|
||||
"selkies-render"
|
||||
],
|
||||
"ATTACHED_DEVICES_PERMS": [
|
||||
"selkies-render"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"gpu_validation": {
|
||||
"device_inventory": "host-sysfs-and-stat",
|
||||
"application_acceleration": "requires-workload-test",
|
||||
"tone_mapping": "not-implied-by-device-access"
|
||||
},
|
||||
"device_permissions": {
|
||||
"strategy": "linuxserver-native-init",
|
||||
"service_user": "abc",
|
||||
"environment": "ATTACHED_DEVICES_PERMS",
|
||||
"paths": "all-resolved-selected-character-devices"
|
||||
}
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"shm_size",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,495 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-firefly",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Firefly"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Firefly, the easiest using of WireGuard VPN server, plus version of wg-easy."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Firefly is a simple and easy to install WireGuard server software, which can be widely used in scenarios such as remote networking, remote work, and expose a local server behind a NAT or firewall to the internet. \ud83c\udfaf Features \ud83d\udfe2 Provide a simple and easy-to-use web management UI \ud83d\udfe3 Supports access to all WireGuard clients \ud83d\udfe1 No need for system installation of WireGuard components \ud83d\udfe0 Single file, no additional library dependencies \ud83d\udd34 Automatically apply for free SSL certificate"
|
||||
},
|
||||
"category": "finance",
|
||||
"category_label": "Finance & Budgeting",
|
||||
"author": "Safe3",
|
||||
"developer": "Safe3",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 50121,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://qq.uusec.com/",
|
||||
"documentation": null,
|
||||
"repository": "https://hub.docker.com/r/uusec/firefly",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "uusec",
|
||||
"repository": "https://hub.docker.com/r/uusec/firefly",
|
||||
"revision": "35bd2ac3b2a663b5a125c65c35bc84540f45452ddca293a31e2ef509feaec1f4",
|
||||
"image_repository_url": "https://hub.docker.com/r/uusec/firefly",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "35bd2ac3b2a663b5a125c65c35bc84540f45452ddca293a31e2ef509feaec1f4",
|
||||
"generated_at": "2026-09-13T15:58:28+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "firefly",
|
||||
"container_name": "firefly",
|
||||
"image": {
|
||||
"reference": "uusec/firefly:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "uusec/firefly",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "FIREFLY_PASSWORD",
|
||||
"example": "${GENERATED_FIREFLY_PASSWORD}",
|
||||
"required": true,
|
||||
"sensitive": true,
|
||||
"source": "docker-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/lib/modules",
|
||||
"compose_source_example": "/lib/modules",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"host-bind"
|
||||
],
|
||||
"default": "host-bind",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-1",
|
||||
"container_path": "/firefly/conf",
|
||||
"compose_source_example": "/DATA/AppData/firefly/conf",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
}
|
||||
],
|
||||
"ports": [],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "version: '3'\nname: firefly\nservices:\n firefly:\n image: uusec/firefly:latest\n container_name: firefly\n devices:\n - /dev/net/tun:/dev/net/tun\n network_mode: host\n volumes:\n - /lib/modules:/lib/modules\n - /DATA/AppData/firefly/conf:/firefly/conf\n cap_add:\n - NET_ADMIN\n - SYS_MODULE\n restart: unless-stopped\n environment:\n - FIREFLY_PASSWORD=${GENERATED_FIREFLY_PASSWORD}\n deploy:\n resources:\n reservations:\n memory: 32M\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "firefly",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "firefly",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "firefly",
|
||||
"image": "uusec/firefly:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"image": "uusec/firefly:latest",
|
||||
"container_name": "firefly",
|
||||
"devices": [
|
||||
"/dev/net/tun:/dev/net/tun"
|
||||
],
|
||||
"network_mode": "host",
|
||||
"volumes": [
|
||||
"/lib/modules:/lib/modules",
|
||||
"/DATA/AppData/firefly/conf:/firefly/conf"
|
||||
],
|
||||
"cap_add": [
|
||||
"NET_ADMIN",
|
||||
"SYS_MODULE"
|
||||
],
|
||||
"restart": "unless-stopped",
|
||||
"environment": [
|
||||
"FIREFLY_PASSWORD=${GENERATED_FIREFLY_PASSWORD}"
|
||||
],
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "32M"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"version": "3",
|
||||
"name": "firefly"
|
||||
},
|
||||
"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": "firefly-volume-0",
|
||||
"service": "firefly",
|
||||
"container_path": "/lib/modules",
|
||||
"mode": "managed-volume",
|
||||
"user_selectable": false,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"source_path": null,
|
||||
"source_path_prompt": null
|
||||
},
|
||||
{
|
||||
"id": "firefly-volume-1",
|
||||
"service": "firefly",
|
||||
"container_path": "/firefly/conf",
|
||||
"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": [
|
||||
"firefly"
|
||||
],
|
||||
"stop_order": [
|
||||
"firefly"
|
||||
],
|
||||
"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": "firefly-password",
|
||||
"strategy": "generate-cryptographically-random-at-install",
|
||||
"bindings": [
|
||||
{
|
||||
"service": "firefly",
|
||||
"environment_variable": "FIREFLY_PASSWORD"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 50121,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"credentials": []
|
||||
},
|
||||
"proxmox": {
|
||||
"runtime": "native-oci-lxc",
|
||||
"technology_status": "proxmox-technology-preview",
|
||||
"defaults": {
|
||||
"unprivileged": true,
|
||||
"ostype": "auto-from-image",
|
||||
"cores": 2,
|
||||
"memory_mb": 128,
|
||||
"swap_mb": 512,
|
||||
"rootfs_size_gb": 8,
|
||||
"rootfs_storage": "local-lvm",
|
||||
"volume_storage": "local-lvm",
|
||||
"template_storage": "local",
|
||||
"bridge": "vmbr0",
|
||||
"ipv4": "dhcp",
|
||||
"firewall": true,
|
||||
"host_managed_network": true,
|
||||
"onboot": false,
|
||||
"features": [
|
||||
"nesting=1"
|
||||
],
|
||||
"shutdown_timeout_seconds": 30
|
||||
},
|
||||
"image_metadata_policy": {
|
||||
"entrypoint": "import-from-oci-image",
|
||||
"cmd": "import-from-oci-image",
|
||||
"environment": "import-image-env-then-apply-compose-overrides",
|
||||
"user": "import-from-oci-image",
|
||||
"working_dir": "import-from-oci-image",
|
||||
"stop_signal": "import-from-oci-image"
|
||||
},
|
||||
"installer_profile": {
|
||||
"device_requests": [
|
||||
{
|
||||
"id": "dev-net-tun",
|
||||
"kind": "character-device",
|
||||
"purpose": "tun",
|
||||
"enable_prompt": "Pass /dev/net/tun to the LXC",
|
||||
"enabled_default": true,
|
||||
"required_by_compose": true,
|
||||
"path_prompt": "Host device for /dev/net/tun",
|
||||
"host_path_default": "/dev/net/tun",
|
||||
"container_path": "/dev/net/tun",
|
||||
"mode": "preserve-host",
|
||||
"deny_write": false,
|
||||
"gid_strategy": "host-device-gid",
|
||||
"source_mapping": "/dev/net/tun:/dev/net/tun"
|
||||
}
|
||||
],
|
||||
"network": {
|
||||
"compose_mode": "host"
|
||||
},
|
||||
"security": {
|
||||
"required_capabilities": [
|
||||
"NET_ADMIN",
|
||||
"SYS_MODULE"
|
||||
],
|
||||
"host_modules": [
|
||||
{
|
||||
"name": "wireguard",
|
||||
"enable_prompt": "Load and verify the WireGuard module on the Proxmox host",
|
||||
"enabled_default": true,
|
||||
"required_by_compose": true
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"adaptations": [
|
||||
{
|
||||
"id": "imported-compose-source",
|
||||
"upstream_behavior": "The source definition deploys the complete Docker Compose application model.",
|
||||
"native_lxc_behavior": "The source model is preserved and remains blocked until every service option has a reviewed native Proxmox mapping.",
|
||||
"reason": "Catalog import must not imply runtime compatibility.",
|
||||
"behavioral_impact": "No automatic installation before review.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "rolling-latest-image",
|
||||
"upstream_behavior": "A discovered Compose may pin a release tag or digest.",
|
||||
"native_lxc_behavior": "ProxMenux selects the same image repository with the latest tag for catalog installations.",
|
||||
"reason": "The automatic catalog intentionally offers rolling latest images; pinned versions belong to the future manual installer.",
|
||||
"behavioral_impact": "The installed release can be newer than the discovered Compose revision.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "A reviewed native application will listen on its original container ports at a dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Published ports are metadata; ProxMenux URLs use the matching container target port.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-command",
|
||||
"upstream_behavior": "Compose replaces the image Cmd while retaining its Entrypoint.",
|
||||
"native_lxc_behavior": "ProxMenux reads the official OCI Entrypoint and combines it with the Compose command as the native LXC init command.",
|
||||
"reason": "Proxmox stores the effective OCI process as one entrypoint string.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-privileged-mode",
|
||||
"upstream_behavior": "Compose selects whether the container runs in privileged mode.",
|
||||
"native_lxc_behavior": "ProxMenux uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"cap_add",
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"group_add",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"security_opt",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"sysctls",
|
||||
"tty",
|
||||
"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,280 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-firefox",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Firefox"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Firefox Browser, also known as Mozilla Firefox or simply Firefox, is a free and open-source web browser developed by the Mozilla Foundation and its subsidiary, the Mozilla Corporation. Firefox uses the Gecko layout engine to render web pages, which implements current and anticipated web standards."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Firefox Browser, also known as Mozilla Firefox or simply Firefox, is a free and open-source web browser developed by the Mozilla Foundation and its subsidiary, the Mozilla Corporation. Firefox uses the Gecko layout engine to render web pages, which implements current and anticipated web standards."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/firefox-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/firefox-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://www.mozilla.org/en-US/firefox/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-firefox/",
|
||||
"repository": "https://github.com/linuxserver/docker-firefox",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-07-04",
|
||||
"note": "Deprecate Kasm branch."
|
||||
},
|
||||
{
|
||||
"date": "2026-04-19",
|
||||
"note": "Rebase to resolute."
|
||||
},
|
||||
{
|
||||
"date": "2026-03-31",
|
||||
"note": "Make Wayland default disable with PIXELFLUX_WAYLAND=false."
|
||||
},
|
||||
{
|
||||
"date": "2025-12-20",
|
||||
"note": "Add Wayland init logic."
|
||||
},
|
||||
{
|
||||
"date": "2025-08-26",
|
||||
"note": "Suppress sandbox security warning as it's misleading inside a container."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-07-04"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-firefox",
|
||||
"default_branch": "master",
|
||||
"revision": "b0424c506af53f07a35604ff6656170fc43f3a14",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-firefox/b0424c506af53f07a35604ff6656170fc43f3a14/README.md",
|
||||
"readme_pushed_at": "2026-09-09T23:03:18Z",
|
||||
"compose_sha256": "eec0a6e3ffc2d05c9e72d9d7b0ca2ef22cd899a318fb2408a113768d127a2870",
|
||||
"generated_at": "2026-09-12T14:37:46+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "firefox",
|
||||
"container_name": "firefox",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/firefox:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/firefox",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "FIREFOX_CLI",
|
||||
"example": "https://www.linuxserver.io/",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/firefox/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": 3000,
|
||||
"published_example": 3000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 3001,
|
||||
"published_example": 3001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n firefox:\n image: lscr.io/linuxserver/firefox:latest\n container_name: firefox\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n - FIREFOX_CLI=https://www.linuxserver.io/ #optional\n volumes:\n - /path/to/firefox/config:/config\n ports:\n - 3000:3000\n - 3001:3001\n shm_size: \"1gb\"\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
}
|
||||
],
|
||||
"installer_profile": {
|
||||
"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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"shm_size",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,435 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-flaresolverr",
|
||||
"status": "laboratory-validated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "FlareSolverr"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": ""
|
||||
},
|
||||
"description": {
|
||||
"en_US": ""
|
||||
},
|
||||
"category": "arr",
|
||||
"category_label": "*Arr Suite",
|
||||
"author": "official",
|
||||
"developer": null,
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 8191,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "",
|
||||
"documentation": null,
|
||||
"repository": "https://ghcr.io/flaresolverr/flaresolverr",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "official",
|
||||
"repository": "https://ghcr.io/flaresolverr/flaresolverr",
|
||||
"revision": "060f6098ed0b43417d1b37a081c0252eb6b598b16541ce992a8ff32ed3d66a55",
|
||||
"image_repository_url": "https://ghcr.io/flaresolverr/flaresolverr",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "060f6098ed0b43417d1b37a081c0252eb6b598b16541ce992a8ff32ed3d66a55",
|
||||
"generated_at": "2026-09-13T15:34:59+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "flaresolverr",
|
||||
"container_name": "flaresolverr",
|
||||
"image": {
|
||||
"reference": "ghcr.io/flaresolverr/flaresolverr:latest",
|
||||
"registry": "ghcr.io",
|
||||
"repository": "ghcr.io/flaresolverr/flaresolverr",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "$PGID",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "$PUID",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "$TZ",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "UMASK",
|
||||
"example": "002",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "LOG_LEVEL",
|
||||
"example": "info",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "LOG_HTML",
|
||||
"example": "false",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "CAPTCHA_SOLVER",
|
||||
"example": "none",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [],
|
||||
"ports": [
|
||||
{
|
||||
"container_port": 8191,
|
||||
"published_example": 8191,
|
||||
"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: flaresolverr\nservices:\n flaresolverr:\n environment:\n PGID: $PGID\n PUID: $PUID\n TZ: $TZ\n UMASK: '002'\n LOG_LEVEL: info\n LOG_HTML: 'false'\n CAPTCHA_SOLVER: none\n cpu_shares: 50\n command: []\n container_name: flaresolverr\n deploy:\n resources:\n reservations:\n memory: 64M\n image: ghcr.io/flaresolverr/flaresolverr:latest\n ports:\n - target: 8191\n published: '8191'\n protocol: tcp\n restart: unless-stopped\n network_mode: bridge\n privileged: false\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "flaresolverr",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "flaresolverr",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "flaresolverr",
|
||||
"image": "ghcr.io/flaresolverr/flaresolverr:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"environment": {
|
||||
"PGID": "$PGID",
|
||||
"PUID": "$PUID",
|
||||
"TZ": "$TZ",
|
||||
"UMASK": "002",
|
||||
"LOG_LEVEL": "info",
|
||||
"LOG_HTML": "false",
|
||||
"CAPTCHA_SOLVER": "none"
|
||||
},
|
||||
"cpu_shares": 50,
|
||||
"command": [],
|
||||
"container_name": "flaresolverr",
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "64M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"image": "ghcr.io/flaresolverr/flaresolverr:latest",
|
||||
"ports": [
|
||||
{
|
||||
"target": 8191,
|
||||
"published": "8191",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"restart": "unless-stopped",
|
||||
"network_mode": "bridge",
|
||||
"privileged": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "flaresolverr"
|
||||
},
|
||||
"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": [
|
||||
"flaresolverr"
|
||||
],
|
||||
"stop_order": [
|
||||
"flaresolverr"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 8191,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"credentials": []
|
||||
},
|
||||
"proxmox": {
|
||||
"runtime": "native-oci-lxc",
|
||||
"technology_status": "proxmox-technology-preview",
|
||||
"defaults": {
|
||||
"unprivileged": true,
|
||||
"ostype": "auto-from-image",
|
||||
"cores": 2,
|
||||
"memory_mb": 128,
|
||||
"swap_mb": 512,
|
||||
"rootfs_size_gb": 8,
|
||||
"rootfs_storage": "local-lvm",
|
||||
"volume_storage": "local-lvm",
|
||||
"template_storage": "local",
|
||||
"bridge": "vmbr0",
|
||||
"ipv4": "dhcp",
|
||||
"firewall": true,
|
||||
"host_managed_network": true,
|
||||
"onboot": false,
|
||||
"features": [
|
||||
"nesting=1"
|
||||
],
|
||||
"shutdown_timeout_seconds": 30
|
||||
},
|
||||
"image_metadata_policy": {
|
||||
"entrypoint": "import-from-oci-image",
|
||||
"cmd": "import-from-oci-image",
|
||||
"environment": "import-image-env-then-apply-compose-overrides",
|
||||
"user": "import-from-oci-image",
|
||||
"working_dir": "import-from-oci-image",
|
||||
"stop_signal": "import-from-oci-image"
|
||||
},
|
||||
"installer_profile": {
|
||||
"runtime": {
|
||||
"command": []
|
||||
},
|
||||
"resources": {
|
||||
"cpu_shares": 50
|
||||
}
|
||||
},
|
||||
"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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-privileged-mode",
|
||||
"upstream_behavior": "Compose selects whether the container runs in privileged mode.",
|
||||
"native_lxc_behavior": "ProxMenux uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"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": "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": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"user",
|
||||
"volumes",
|
||||
"working_dir"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "Single-image definitions are installable when every declared Compose option has a native Proxmox translation. Multi-image and unsupported runtime features remain blocked until their orchestrator or mapping is available."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "passed-amd64",
|
||||
"service_health": "passed-amd64",
|
||||
"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,286 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-flexget",
|
||||
"status": "laboratory-validated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Flexget"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Flexget is a multipurpose automation tool for all of your media."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Flexget is a multipurpose automation tool for all of your media."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/flexget-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/flexget-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 5050,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "http://flexget.com/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-flexget/",
|
||||
"repository": "https://github.com/linuxserver/docker-flexget",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-08-15",
|
||||
"note": "Rebase to Alpine 3.23."
|
||||
},
|
||||
{
|
||||
"date": "2025-11-10",
|
||||
"note": "Rebase to Alpine 3.22."
|
||||
},
|
||||
{
|
||||
"date": "2025-10-17",
|
||||
"note": "Add pip to enable [universal-package-install mod](https://github.com/linuxserver/docker-mods/tree/universal-package-install)."
|
||||
},
|
||||
{
|
||||
"date": "2024-09-18",
|
||||
"note": "Suppress creation of empty log file when WebUI password is set."
|
||||
},
|
||||
{
|
||||
"date": "2024-08-17",
|
||||
"note": "Revert to Alpine 3.20 due to 1st party plugin incompatibility with Python 3.12."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-08-15"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-flexget",
|
||||
"default_branch": "main",
|
||||
"revision": "8904f76df17bcd4f6a66603327a75fee3906f1dd",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-flexget/8904f76df17bcd4f6a66603327a75fee3906f1dd/README.md",
|
||||
"readme_pushed_at": "2026-09-11T21:37:54Z",
|
||||
"compose_sha256": "d174ad5994c5b9ad3c365e4309ec762ebd64ee70badf95814efeb935aa7412e0",
|
||||
"generated_at": "2026-09-12T14:37:26+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "flexget",
|
||||
"container_name": "flexget",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/flexget:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/flexget",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "FG_LOG_LEVEL",
|
||||
"example": "info",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "FG_LOG_FILE",
|
||||
"example": "/config/flexget.log",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "FG_CONFIG_FILE",
|
||||
"example": "/config/.flexget/config.yml",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "FG_WEBUI_PASSWORD",
|
||||
"example": "info",
|
||||
"required": false,
|
||||
"sensitive": true,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/flexget/data",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 4
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-1",
|
||||
"container_path": "/data",
|
||||
"compose_source_example": "/path/to/downloads",
|
||||
"read_only": false,
|
||||
"required": false,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind",
|
||||
"skip"
|
||||
],
|
||||
"default": "skip",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
}
|
||||
],
|
||||
"ports": [
|
||||
{
|
||||
"container_port": 5050,
|
||||
"published_example": 5050,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n flexget:\n image: lscr.io/linuxserver/flexget:latest\n container_name: flexget\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n - FG_LOG_LEVEL=info\n - FG_LOG_FILE=/config/flexget.log\n - FG_CONFIG_FILE=/config/.flexget/config.yml\n - FG_WEBUI_PASSWORD=info #optional\n volumes:\n - /path/to/flexget/data:/config\n - /path/to/downloads:/data #optional\n ports:\n - 5050:5050\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 5050,
|
||||
"path": "/",
|
||||
"source": "compose-first-tcp-port-fallback"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "passed-amd64",
|
||||
"service_health": "passed-amd64",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,495 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-flowise",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Flowise"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "An open source generative AI development platform for building AI Agents and LLM workflows"
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Flowise is a generative AI development platform for building AI agents and LLM workflows. An intuitive interface with a visual editor simplifies complex workflow design, ideal for developers creating diverse AI applications, from chatbots to data processing pipelines.\n\nCore features include visual orchestration and data integration. Support for various models, custom code, and branching, looping, and routing logic enables complex workflow creation. Connection to over 100 data sources, vector databases, and memory modules ensures flexible data ingestion. Monitoring capabilities provide execution logs and visual debugging for workflow transparency and maintenance. Self-hosted and air-gapped deployment options accommodate diverse infrastructure needs.\n\nIt offers data processing with transforms, filters, aggregates, and RAG indexing pipelines. Memory optimization and planning techniques enhance performance, while MCP integration supports tool connections and authentication. Security controls include role-based access, single sign-on, and encrypted credentials for data protection. API, JavaScript and Python SDKs, and command-line interface enable extensibility, with embedded chat components and a template marketplace accelerating development. Scalability supports high-throughput workflows, and evaluation features optimize performance. With flexibility and efficiency at the core, the platform delivers a modern solution for AI development.\n\n**Key Features:**\n- Visual editor supporting multiple models, custom code, branching looping routing logic\n- Connection to over 100 data sources, vector databases, and memory modules\n- Execution logs and visual debugging for enhanced monitoring\n- Data processing with transforms, filters, aggregates, and RAG indexing pipelines\n- Various memory optimization technique and integrations\n- MCP client and server nodes for tool integration\n- Input moderation and output post-processing for safety\n- API, JavaScript and Python SDKs, and command-line interface\n- Customizable embedded chat components\n- Template marketplace and reusable components\n- Role-based access control, single sign-on, encrypted credentials\n- Vertical and horizontal scalability for high-throughput workflows\n- Datasets and evaluation features for workflow optimization\n\n**Learn More:**\n- [Flowise Official Website](https://flowiseai.com/)\n- [Flowise GitHub](https://github.com/flowiseai/flowise)\n- [Flowise Documentation](https://docs.flowiseai.com/)\n"
|
||||
},
|
||||
"category": "ai",
|
||||
"category_label": "AI / Coding & Dev-Tools",
|
||||
"author": "Flowise",
|
||||
"developer": "Flowise",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 3025,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://flowiseai.com/",
|
||||
"documentation": null,
|
||||
"repository": "https://hub.docker.com/r/flowiseai/flowise",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "official",
|
||||
"repository": "https://hub.docker.com/r/flowiseai/flowise",
|
||||
"revision": "b0fcc71bc9b5785dcf7a4e01d112f662783c0ca29716fec98385e23fd51f78cc",
|
||||
"image_repository_url": "https://hub.docker.com/r/flowiseai/flowise",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "b0fcc71bc9b5785dcf7a4e01d112f662783c0ca29716fec98385e23fd51f78cc",
|
||||
"generated_at": "2026-09-13T15:34:59+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "flowise",
|
||||
"container_name": "flowise",
|
||||
"image": {
|
||||
"reference": "flowiseai/flowise:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "flowiseai/flowise",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PORT",
|
||||
"example": "3025",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "DATABASE_PATH",
|
||||
"example": "/root/.flowise",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "APIKEY_PATH",
|
||||
"example": "${GENERATED_APIKEY_PATH}",
|
||||
"required": true,
|
||||
"sensitive": true,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "SECRETKEY_PATH",
|
||||
"example": "${GENERATED_SECRETKEY_PATH}",
|
||||
"required": true,
|
||||
"sensitive": true,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "LOG_PATH",
|
||||
"example": "/root/.flowise/logs",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "BLOB_STORAGE_PATH",
|
||||
"example": "/root/.flowise/storage",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "FLOWISE_USERNAME",
|
||||
"example": "flowise",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "FLOWISE_PASSWORD",
|
||||
"example": "${GENERATED_FLOWISE_PASSWORD}",
|
||||
"required": true,
|
||||
"sensitive": true,
|
||||
"source": "docker-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/root/.flowise",
|
||||
"compose_source_example": "/DATA/AppData/$AppID",
|
||||
"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": 3025,
|
||||
"published_example": 3025,
|
||||
"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: flowise\nservices:\n flowise:\n image: flowiseai/flowise:latest\n container_name: flowise\n restart: unless-stopped\n deploy:\n resources:\n reservations:\n memory: 256M\n environment:\n - PORT=3025\n - DATABASE_PATH=/root/.flowise\n - APIKEY_PATH=${GENERATED_APIKEY_PATH}\n - SECRETKEY_PATH=${GENERATED_SECRETKEY_PATH}\n - LOG_PATH=/root/.flowise/logs\n - BLOB_STORAGE_PATH=/root/.flowise/storage\n - FLOWISE_USERNAME=flowise\n - FLOWISE_PASSWORD=${GENERATED_FLOWISE_PASSWORD}\n ports:\n - 3025:3025\n volumes:\n - /DATA/AppData/$AppID:/root/.flowise\n entrypoint: /bin/sh -c \"sleep 3; flowise start\"\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "flowise",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "flowise",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "flowise",
|
||||
"image": "flowiseai/flowise:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"image": "flowiseai/flowise:latest",
|
||||
"container_name": "flowise",
|
||||
"restart": "unless-stopped",
|
||||
"deploy": {
|
||||
"resources": {
|
||||
"reservations": {
|
||||
"memory": "256M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"environment": [
|
||||
"PORT=3025",
|
||||
"DATABASE_PATH=/root/.flowise",
|
||||
"APIKEY_PATH=${GENERATED_APIKEY_PATH}",
|
||||
"SECRETKEY_PATH=${GENERATED_SECRETKEY_PATH}",
|
||||
"LOG_PATH=/root/.flowise/logs",
|
||||
"BLOB_STORAGE_PATH=/root/.flowise/storage",
|
||||
"FLOWISE_USERNAME=flowise",
|
||||
"FLOWISE_PASSWORD=${GENERATED_FLOWISE_PASSWORD}"
|
||||
],
|
||||
"ports": [
|
||||
"3025:3025"
|
||||
],
|
||||
"volumes": [
|
||||
"/DATA/AppData/$AppID:/root/.flowise"
|
||||
],
|
||||
"entrypoint": "/bin/sh -c \"sleep 3; flowise start\""
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "flowise"
|
||||
},
|
||||
"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": "flowise-volume-0",
|
||||
"service": "flowise",
|
||||
"container_path": "/root/.flowise",
|
||||
"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": [
|
||||
"flowise"
|
||||
],
|
||||
"stop_order": [
|
||||
"flowise"
|
||||
],
|
||||
"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": "apikey-path",
|
||||
"strategy": "generate-cryptographically-random-at-install",
|
||||
"bindings": [
|
||||
{
|
||||
"service": "flowise",
|
||||
"environment_variable": "APIKEY_PATH"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "flowise-password",
|
||||
"strategy": "generate-cryptographically-random-at-install",
|
||||
"bindings": [
|
||||
{
|
||||
"service": "flowise",
|
||||
"environment_variable": "FLOWISE_PASSWORD"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "secretkey-path",
|
||||
"strategy": "generate-cryptographically-random-at-install",
|
||||
"bindings": [
|
||||
{
|
||||
"service": "flowise",
|
||||
"environment_variable": "SECRETKEY_PATH"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 3025,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"credentials": []
|
||||
},
|
||||
"proxmox": {
|
||||
"runtime": "native-oci-lxc",
|
||||
"technology_status": "proxmox-technology-preview",
|
||||
"defaults": {
|
||||
"unprivileged": true,
|
||||
"ostype": "auto-from-image",
|
||||
"cores": 2,
|
||||
"memory_mb": 256,
|
||||
"swap_mb": 512,
|
||||
"rootfs_size_gb": 8,
|
||||
"rootfs_storage": "local-lvm",
|
||||
"volume_storage": "local-lvm",
|
||||
"template_storage": "local",
|
||||
"bridge": "vmbr0",
|
||||
"ipv4": "dhcp",
|
||||
"firewall": true,
|
||||
"host_managed_network": true,
|
||||
"onboot": false,
|
||||
"features": [
|
||||
"nesting=1"
|
||||
],
|
||||
"shutdown_timeout_seconds": 30
|
||||
},
|
||||
"image_metadata_policy": {
|
||||
"entrypoint": "import-from-oci-image",
|
||||
"cmd": "import-from-oci-image",
|
||||
"environment": "import-image-env-then-apply-compose-overrides",
|
||||
"user": "import-from-oci-image",
|
||||
"working_dir": "import-from-oci-image",
|
||||
"stop_signal": "import-from-oci-image"
|
||||
},
|
||||
"installer_profile": {
|
||||
"runtime": {
|
||||
"compose_entrypoint": "/bin/sh -c \"sleep 3; flowise start\""
|
||||
}
|
||||
},
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"behavioral_impact": "A privileged LXC has weaker isolation from the Proxmox host.",
|
||||
"validation": "native-equivalent"
|
||||
},
|
||||
{
|
||||
"id": "compose-process-runtime",
|
||||
"upstream_behavior": "Compose can replace Entrypoint, User and WorkingDir and request an init process or interactive terminal.",
|
||||
"native_lxc_behavior": "ProxMenux applies the process overrides through native LXC init directives; lxc-init provides PID 1 supervision and the CT console provides terminal access.",
|
||||
"reason": "The OCI process must start with the same identity, command and working directory without Docker.",
|
||||
"behavioral_impact": "Compose stdin_open and tty become access through the Proxmox LXC console.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-healthcheck",
|
||||
"upstream_behavior": "Docker periodically executes the declared container healthcheck.",
|
||||
"native_lxc_behavior": "For a single-service LXC, ProxMenux translates HTTP localhost checks into a mandatory first-start service check.",
|
||||
"reason": "Proxmox has no persistent Docker health state, while the installer still must detect a failed first boot.",
|
||||
"behavioral_impact": "The check runs during installation rather than continuously after installation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-cpu-priority",
|
||||
"upstream_behavior": "Docker cpu_shares sets a relative scheduling weight with 1024 as its neutral value.",
|
||||
"native_lxc_behavior": "ProxMenux converts the relative weight to Proxmox cpuunits with 100 as its neutral value and lets the user review it.",
|
||||
"reason": "Both settings express relative CPU priority on different scales.",
|
||||
"behavioral_impact": "Rounding and Proxmox minimum limits can slightly change very low weights.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-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": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"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,268 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-flycast",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Flycast"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Flycast is a multi-platform Sega Dreamcast, Naomi, Naomi 2, and Atomiswave emulator derived from reicast."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Flycast is a multi-platform Sega Dreamcast, Naomi, Naomi 2, and Atomiswave emulator derived from reicast."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/flycast-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/flycast-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://github.com/flyinghead/flycast",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-flycast/",
|
||||
"repository": "https://github.com/linuxserver/docker-flycast",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-03-05",
|
||||
"note": "Make Wayland default disable with PIXELFLUX_WAYLAND=false."
|
||||
},
|
||||
{
|
||||
"date": "2025-12-20",
|
||||
"note": "Add Wayland init logic."
|
||||
},
|
||||
{
|
||||
"date": "2025-09-22",
|
||||
"note": "Rebase to Debian Trixie."
|
||||
},
|
||||
{
|
||||
"date": "2025-06-19",
|
||||
"note": "Initial release."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-03-05"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-flycast",
|
||||
"default_branch": "master",
|
||||
"revision": "30b068b62b845200f998a4bf9c6e791f8ba9d37d",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-flycast/30b068b62b845200f998a4bf9c6e791f8ba9d37d/README.md",
|
||||
"readme_pushed_at": "2026-09-06T19:37:00Z",
|
||||
"compose_sha256": "cf1ccd0eb8c5ea1891253662d399e5156a2bf938897048b24f73dc775b35d15e",
|
||||
"generated_at": "2026-09-12T14:37:27+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "flycast",
|
||||
"container_name": "flycast",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/flycast:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/flycast",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/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": 3000,
|
||||
"published_example": 3000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 3001,
|
||||
"published_example": 3001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n flycast:\n image: lscr.io/linuxserver/flycast:latest\n container_name: flycast\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/config:/config\n ports:\n - 3000:3000\n - 3001:3001\n shm_size: \"1gb\"\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
}
|
||||
],
|
||||
"installer_profile": {
|
||||
"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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"shm_size",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,262 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-foldingathome",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Foldingathome"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "Folding@home is a distributed computing project for simulating protein dynamics, including the process of protein folding and the movements of proteins implicated in a variety of diseases. It brings together citizen scientists who volunteer to run simulations of protein dynamics on their personal computers. Insights from this data are helping scientists to better understand biology, and providing new opportunities for developing therapeutics."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "Folding@home is a distributed computing project for simulating protein dynamics, including the process of protein folding and the movements of proteins implicated in a variety of diseases. It brings together citizen scientists who volunteer to run simulations of protein dynamics on their personal computers. Insights from this data are helping scientists to better understand biology, and providing new opportunities for developing therapeutics."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/foldingathome-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/foldingathome-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 7396,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://foldingathome.org/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-foldingathome/",
|
||||
"repository": "https://github.com/linuxserver/docker-foldingathome",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2024-08-10",
|
||||
"note": "Add libexpat1 for Nvidia support."
|
||||
},
|
||||
{
|
||||
"date": "2024-06-25",
|
||||
"note": "***Breaking Changes*** - Please see the Application Setup section for more details. Restructure image for F@H v8."
|
||||
},
|
||||
{
|
||||
"date": "2024-06-15",
|
||||
"note": "Rebase to Ubuntu Noble, add optional cli args."
|
||||
},
|
||||
{
|
||||
"date": "2022-12-14",
|
||||
"note": "Rebase to Ubuntu Jammy, migrate to s6v3."
|
||||
},
|
||||
{
|
||||
"date": "2022-01-15",
|
||||
"note": "Rebase to Ubuntu Focal. Add arm64v8 builds (cpu only). Increase verbosity about gpu driver permission settings."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2024-08-10"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-foldingathome",
|
||||
"default_branch": "master",
|
||||
"revision": "e8543b5d2ddefa727eff8076ba6a31b0619e0718",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-foldingathome/e8543b5d2ddefa727eff8076ba6a31b0619e0718/README.md",
|
||||
"readme_pushed_at": "2026-09-08T07:45:56Z",
|
||||
"compose_sha256": "8ef7f929c4fc69fbdc081b65b0ec0db3e50ec7d247e2034ca538a7467ed72551",
|
||||
"generated_at": "2026-09-12T14:37:28+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "foldingathome",
|
||||
"container_name": "foldingathome",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/foldingathome:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/foldingathome",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "ACCOUNT_TOKEN",
|
||||
"example": "",
|
||||
"required": true,
|
||||
"sensitive": true,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "MACHINE_NAME",
|
||||
"example": "",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "CLI_ARGS",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/foldingathome/data",
|
||||
"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": 7396,
|
||||
"published_example": 7396,
|
||||
"protocol": "tcp",
|
||||
"required": false,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n foldingathome:\n image: lscr.io/linuxserver/foldingathome:latest\n container_name: foldingathome\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n - ACCOUNT_TOKEN=\n - MACHINE_NAME=\n - CLI_ARGS= #optional\n volumes:\n - /path/to/foldingathome/data:/config\n ports:\n - 7396:7396 #optional\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 7396,
|
||||
"path": "/",
|
||||
"source": "compose-first-tcp-port-fallback"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,373 @@
|
||||
{
|
||||
"schema_version": "0.3.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "linuxserver-freecad",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "Freecad"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "FreeCAD is a general-purpose parametric 3D computer-aided design (CAD) modeler and a building information modeling (BIM) software application with finite element method (FEM) support."
|
||||
},
|
||||
"description": {
|
||||
"en_US": "FreeCAD is a general-purpose parametric 3D computer-aided design (CAD) modeler and a building information modeling (BIM) software application with finite element method (FEM) support."
|
||||
},
|
||||
"category": "misc",
|
||||
"category_label": "Miscellaneous",
|
||||
"author": "LinuxServer.io",
|
||||
"developer": null,
|
||||
"icon": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/freecad-icon.png",
|
||||
"thumbnail": "https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/freecad-banner.png",
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://www.freecad.org/",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-freecad/",
|
||||
"repository": "https://github.com/linuxserver/docker-freecad",
|
||||
"tips": [],
|
||||
"mini_changelog": [
|
||||
{
|
||||
"date": "2026-03-29",
|
||||
"note": "Make Wayland default disable with PIXELFLUX_WAYLAND=false."
|
||||
},
|
||||
{
|
||||
"date": "2025-12-28",
|
||||
"note": "Add Wayland init logic."
|
||||
},
|
||||
{
|
||||
"date": "2025-09-22",
|
||||
"note": "Rebase to Debian Trixie."
|
||||
},
|
||||
{
|
||||
"date": "2025-07-02",
|
||||
"note": "Rebase to Selkies, HTTPS is now required! Ingest from current appimage."
|
||||
},
|
||||
{
|
||||
"date": "2024-02-10",
|
||||
"note": "Update Readme with new env vars and ingest proper PWA icon."
|
||||
}
|
||||
],
|
||||
"display_version": null,
|
||||
"updated_at": "2026-03-29"
|
||||
},
|
||||
"source": {
|
||||
"provider": "linuxserver.io",
|
||||
"repository": "https://github.com/linuxserver/docker-freecad",
|
||||
"default_branch": "master",
|
||||
"revision": "d8a6af24acd749f1a190e96f2cf0c1c9dbf881ba",
|
||||
"readme_raw_url": "https://raw.githubusercontent.com/linuxserver/docker-freecad/d8a6af24acd749f1a190e96f2cf0c1c9dbf881ba/README.md",
|
||||
"readme_pushed_at": "2026-09-12T14:09:40Z",
|
||||
"compose_sha256": "a8880c175cb3132aef97efe4d5dc096b9771d9d44096b55f600fbb17d2209be5",
|
||||
"generated_at": "2026-09-12T14:37:27+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "freecad",
|
||||
"container_name": "freecad",
|
||||
"image": {
|
||||
"reference": "lscr.io/linuxserver/freecad:latest",
|
||||
"registry": "lscr.io",
|
||||
"repository": "lscr.io/linuxserver/freecad",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "PUID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "PGID",
|
||||
"example": "1000",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "Etc/UTC",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "linuxserver-compose"
|
||||
},
|
||||
{
|
||||
"name": "LC_ALL",
|
||||
"example": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"source": "upstream-documentation",
|
||||
"prompt": "Language/locale (e.g. es_ES.UTF-8; translation of every application is not guaranteed)"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/config",
|
||||
"compose_source_example": "/path/to/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": 3000,
|
||||
"published_example": 3000,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
},
|
||||
{
|
||||
"container_port": 3001,
|
||||
"published_example": 3001,
|
||||
"protocol": "tcp",
|
||||
"required": true,
|
||||
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||
}
|
||||
],
|
||||
"related_services": [],
|
||||
"restart": "unless-stopped",
|
||||
"stop_grace_period": null,
|
||||
"original_compose": "---\nservices:\n freecad:\n image: lscr.io/linuxserver/freecad:latest\n container_name: freecad\n environment:\n - PUID=1000\n - PGID=1000\n - TZ=Etc/UTC\n volumes:\n - /path/to/config:/config\n ports:\n - 3000:3000\n - 3001:3001\n shm_size: \"1gb\"\n restart: unless-stopped\n"
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "https",
|
||||
"port": 3001,
|
||||
"path": "/",
|
||||
"source": "linuxserver-readme-application-setup"
|
||||
}
|
||||
],
|
||||
"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": "dedicated-lxc-network",
|
||||
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "compose-environment-overlay",
|
||||
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
},
|
||||
{
|
||||
"id": "stop-grace-period",
|
||||
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-shm-size",
|
||||
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||
"behavioral_impact": "None expected.",
|
||||
"validation": "pending-per-application"
|
||||
}
|
||||
],
|
||||
"installer_profile": {
|
||||
"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"
|
||||
]
|
||||
},
|
||||
{
|
||||
"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"
|
||||
]
|
||||
}
|
||||
],
|
||||
"selkies": {
|
||||
"base": "FROM ghcr.io/linuxserver/baseimage-selkies:debiantrixie",
|
||||
"dockerfile_url": "https://raw.githubusercontent.com/linuxserver/docker-freecad/master/Dockerfile",
|
||||
"dockerfile_sha256": "3e76dc197f77f9256bf7af2d507ff11e0ccedeb1f65a79ab05ee8ce9d3e42421",
|
||||
"reviewed_on": "2026-09-16",
|
||||
"documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/",
|
||||
"nvidia": "not-offered-until-specific-host-and-image-validation",
|
||||
"validation": "profile-generated; real streaming workload pending"
|
||||
},
|
||||
"optional_devices": [],
|
||||
"hardware_acceleration": {
|
||||
"prompt": "Selkies desktop and streaming acceleration",
|
||||
"default": "none",
|
||||
"profiles": [
|
||||
{
|
||||
"id": "none",
|
||||
"label": "No GPU (CPU)",
|
||||
"device_requests": [],
|
||||
"environment": [
|
||||
{
|
||||
"name": "AUTO_GPU",
|
||||
"value": "false"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "vaapi",
|
||||
"label": "Intel/AMD (streaming rendering and encoding)",
|
||||
"device_requests": [
|
||||
{
|
||||
"id": "selkies-render",
|
||||
"kind": "character-device",
|
||||
"path_prompt": "Intel/AMD render node",
|
||||
"host_path_default": "/dev/dri/renderD128",
|
||||
"container_path_strategy": "same-as-host",
|
||||
"mode": "0660",
|
||||
"deny_write": false,
|
||||
"gid_strategy": "host-device-gid",
|
||||
"drm_vendor_ids": [
|
||||
"0x8086",
|
||||
"0x1002"
|
||||
]
|
||||
}
|
||||
],
|
||||
"environment": [
|
||||
{
|
||||
"name": "PIXELFLUX_WAYLAND",
|
||||
"value": "true"
|
||||
},
|
||||
{
|
||||
"name": "AUTO_GPU",
|
||||
"value": "false"
|
||||
}
|
||||
],
|
||||
"environment_from_devices": {
|
||||
"DRINODE": [
|
||||
"selkies-render"
|
||||
],
|
||||
"DRI_NODE": [
|
||||
"selkies-render"
|
||||
],
|
||||
"ATTACHED_DEVICES_PERMS": [
|
||||
"selkies-render"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"gpu_validation": {
|
||||
"device_inventory": "host-sysfs-and-stat",
|
||||
"application_acceleration": "requires-workload-test",
|
||||
"tone_mapping": "not-implied-by-device-access"
|
||||
},
|
||||
"device_permissions": {
|
||||
"strategy": "linuxserver-native-init",
|
||||
"service_user": "abc",
|
||||
"environment": "ATTACHED_DEVICES_PERMS",
|
||||
"paths": "all-resolved-selected-character-devices"
|
||||
}
|
||||
}
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"container_name",
|
||||
"environment",
|
||||
"image",
|
||||
"ports",
|
||||
"restart",
|
||||
"shm_size",
|
||||
"stop_grace_period",
|
||||
"volumes"
|
||||
],
|
||||
"untranslated_blockers": [],
|
||||
"policy": "A generated template is never promoted to validated without install, health, restart and persistence tests."
|
||||
},
|
||||
"validation": {
|
||||
"schema": "passed-at-generation",
|
||||
"clean_install": "pending",
|
||||
"service_health": "pending",
|
||||
"restart_persistence": "pending",
|
||||
"backup_restore": "pending",
|
||||
"update_preserves_data": "pending"
|
||||
},
|
||||
"lifecycle": {
|
||||
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||
"registry_state": {
|
||||
"resolved_architecture": null,
|
||||
"resolved_digest": null,
|
||||
"image_version_label": null,
|
||||
"image_created": null
|
||||
},
|
||||
"change_detection": "compare-resolved-architecture-digest",
|
||||
"automatic_unattended_updates": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,445 @@
|
||||
{
|
||||
"schema_version": "0.5.0",
|
||||
"kind": "proxmenux.oci-template",
|
||||
"id": "image-freshrss-official",
|
||||
"status": "generated-unvalidated",
|
||||
"catalog_ui": {
|
||||
"title": {
|
||||
"en_US": "FreshRSS"
|
||||
},
|
||||
"tagline": {
|
||||
"en_US": "A free, self-hostable news aggregator\u2026"
|
||||
},
|
||||
"description": {
|
||||
"en_US": "FreshRSS is a self-hosted RSS and Atom feed aggregator. It is lightweight, easy to work with, powerful, and customizable."
|
||||
},
|
||||
"category": "media",
|
||||
"category_label": "Media & Streaming",
|
||||
"author": "FreshRSS",
|
||||
"developer": "FreshRSS",
|
||||
"icon": null,
|
||||
"thumbnail": null,
|
||||
"screenshots": [],
|
||||
"architectures": [
|
||||
"amd64",
|
||||
"arm64"
|
||||
],
|
||||
"launch": {
|
||||
"scheme": "http",
|
||||
"port": 80,
|
||||
"path": "/"
|
||||
},
|
||||
"website": "https://freshrss.org/",
|
||||
"documentation": null,
|
||||
"repository": "https://hub.docker.com/r/freshrss/freshrss",
|
||||
"tips": [],
|
||||
"mini_changelog": [],
|
||||
"display_version": null,
|
||||
"updated_at": null
|
||||
},
|
||||
"source": {
|
||||
"provider": "official",
|
||||
"repository": "https://hub.docker.com/r/freshrss/freshrss",
|
||||
"revision": "6d0b99f554391e2950911d5eedd9a455f60969dcb575d8c47070d2f7bc4ae1c7",
|
||||
"image_repository_url": "https://hub.docker.com/r/freshrss/freshrss",
|
||||
"readme_pushed_at": "2026-09-11T10:43:22Z",
|
||||
"compose_sha256": "6d0b99f554391e2950911d5eedd9a455f60969dcb575d8c47070d2f7bc4ae1c7",
|
||||
"generated_at": "2026-09-13T15:34:59+00:00"
|
||||
},
|
||||
"container_contract": {
|
||||
"service_name": "freshrss",
|
||||
"container_name": "freshrss",
|
||||
"image": {
|
||||
"reference": "freshrss/freshrss:latest",
|
||||
"registry": "docker.io",
|
||||
"repository": "freshrss/freshrss",
|
||||
"tag": "latest",
|
||||
"digest": null,
|
||||
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||
},
|
||||
"environment": [
|
||||
{
|
||||
"name": "TZ",
|
||||
"example": "",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
},
|
||||
{
|
||||
"name": "CRON_MIN",
|
||||
"example": "1,31",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"source": "docker-compose"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"id": "volume-0",
|
||||
"container_path": "/var/www/FreshRSS/data",
|
||||
"compose_source_example": "/DATA/AppData/freshrss/data",
|
||||
"read_only": false,
|
||||
"required": true,
|
||||
"installation_choice": [
|
||||
"managed-volume",
|
||||
"host-bind"
|
||||
],
|
||||
"default": "managed-volume",
|
||||
"managed_volume": {
|
||||
"backup": true,
|
||||
"default_size_gb": 8
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "volume-1",
|
||||
"container_path": "/var/www/FreshRSS/extensions",
|
||||
"compose_source_example": "/DATA/AppData/freshrss/extensions",
|
||||
"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": 8749,
|
||||
"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: freshrss\nservices:\n freshrss:\n restart: unless-stopped\n environment:\n TZ: ''\n CRON_MIN: 1,31\n image: freshrss/freshrss:latest\n network_mode: bridge\n ports:\n - target: 80\n published: '8749'\n protocol: tcp\n volumes:\n - type: bind\n source: /DATA/AppData/freshrss/data\n target: /var/www/FreshRSS/data\n - type: bind\n source: /DATA/AppData/freshrss/extensions\n target: /var/www/FreshRSS/extensions\n container_name: freshrss\n"
|
||||
},
|
||||
"compose_stack": {
|
||||
"project_name": "freshrss",
|
||||
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||
"user_experience": "single-application-install",
|
||||
"main_service": "freshrss",
|
||||
"service_count": 1,
|
||||
"services": [
|
||||
{
|
||||
"name": "freshrss",
|
||||
"image": "freshrss/freshrss:latest",
|
||||
"is_main": true,
|
||||
"role": "frontend",
|
||||
"vmid_offset": 0,
|
||||
"depends_on": [],
|
||||
"frontend_network": true,
|
||||
"private_network": false,
|
||||
"compose": {
|
||||
"restart": "unless-stopped",
|
||||
"environment": {
|
||||
"TZ": "",
|
||||
"CRON_MIN": "1,31"
|
||||
},
|
||||
"image": "freshrss/freshrss:latest",
|
||||
"network_mode": "bridge",
|
||||
"ports": [
|
||||
{
|
||||
"target": 80,
|
||||
"published": "8749",
|
||||
"protocol": "tcp"
|
||||
}
|
||||
],
|
||||
"volumes": [
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/freshrss/data",
|
||||
"target": "/var/www/FreshRSS/data"
|
||||
},
|
||||
{
|
||||
"type": "bind",
|
||||
"source": "/DATA/AppData/freshrss/extensions",
|
||||
"target": "/var/www/FreshRSS/extensions"
|
||||
}
|
||||
],
|
||||
"container_name": "freshrss"
|
||||
}
|
||||
}
|
||||
],
|
||||
"top_level": {
|
||||
"name": "freshrss"
|
||||
},
|
||||
"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": "freshrss-volume-0",
|
||||
"service": "freshrss",
|
||||
"container_path": "/var/www/FreshRSS/data",
|
||||
"mode": "managed-volume",
|
||||
"user_selectable": false,
|
||||
"backup": true,
|
||||
"shared_with_other_lxc": false,
|
||||
"source_path": null,
|
||||
"source_path_prompt": null
|
||||
},
|
||||
{
|
||||
"id": "freshrss-volume-1",
|
||||
"service": "freshrss",
|
||||
"container_path": "/var/www/FreshRSS/extensions",
|
||||
"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": [
|
||||
"freshrss"
|
||||
],
|
||||
"stop_order": [
|
||||
"freshrss"
|
||||
],
|
||||
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||
},
|
||||
"installer_inputs": {
|
||||
"prompted": [
|
||||
"stack_name",
|
||||
"base_vmid",
|
||||
"rootfs_storage",
|
||||
"persistent_data_destinations",
|
||||
"frontend_bridge",
|
||||
"frontend_ipv4_mode"
|
||||
],
|
||||
"automatic": [
|
||||
"dependent_vmids",
|
||||
"private_bridge",
|
||||
"private_subnet",
|
||||
"private_service_addresses",
|
||||
"compose_service_aliases",
|
||||
"generated_secrets",
|
||||
"dependency_start_and_stop_order"
|
||||
],
|
||||
"generated_secrets": []
|
||||
}
|
||||
},
|
||||
"first_run": {
|
||||
"endpoints": [
|
||||
{
|
||||
"label": "Web UI",
|
||||
"scheme": "http",
|
||||
"port": 80,
|
||||
"path": "/",
|
||||
"source": "compose-metadata"
|
||||
}
|
||||
],
|
||||
"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 uses a privileged LXC only after an explicit high-risk confirmation; otherwise it keeps the LXC unprivileged.",
|
||||
"reason": "The native OCI-LXC deployment must preserve the requested privilege level without silently weakening isolation.",
|
||||
"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-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": "docker-engine-metadata",
|
||||
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-device-passthrough",
|
||||
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||
"validation": "not-requested-by-compose"
|
||||
},
|
||||
{
|
||||
"id": "compose-host-ipc",
|
||||
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||
"validation": "not-requested-by-compose"
|
||||
}
|
||||
]
|
||||
},
|
||||
"compatibility": {
|
||||
"automatic_install_candidate": true,
|
||||
"validated": false,
|
||||
"supported_compose_keys": [
|
||||
"command",
|
||||
"container_name",
|
||||
"cpu_shares",
|
||||
"deploy",
|
||||
"devices",
|
||||
"entrypoint",
|
||||
"environment",
|
||||
"extra_hosts",
|
||||
"healthcheck",
|
||||
"hostname",
|
||||
"image",
|
||||
"init",
|
||||
"ipc",
|
||||
"labels",
|
||||
"logging",
|
||||
"mac_address",
|
||||
"network_mode",
|
||||
"networks",
|
||||
"ports",
|
||||
"privileged",
|
||||
"restart",
|
||||
"runtime",
|
||||
"shm_size",
|
||||
"stdin_open",
|
||||
"stop_grace_period",
|
||||
"tty",
|
||||
"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
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user