From 2014105343927caa9c810a8b87c94703dbb91a87 Mon Sep 17 00:00:00 2001 From: Jonatan Date: Mon, 26 Oct 2026 07:16:45 +0100 Subject: [PATCH] Add 25 curated OCI application profiles --- oci/catalog/apps/artalk.json | 276 +++++++++ oci/catalog/apps/bichon.json | 313 ++++++++++ oci/catalog/apps/calnode.json | 333 +++++++++++ oci/catalog/apps/cooktrace.json | 353 ++++++++++++ oci/catalog/apps/degubase.json | 320 +++++++++++ oci/catalog/apps/flagr.json | 303 ++++++++++ oci/catalog/apps/guestroll.json | 307 ++++++++++ oci/catalog/apps/ihatemoney.json | 352 ++++++++++++ oci/catalog/apps/imagesilo.json | 296 ++++++++++ oci/catalog/apps/instatic.json | 368 ++++++++++++ oci/catalog/apps/invoiceshelf.json | 387 +++++++++++++ oci/catalog/apps/kroma.json | 311 ++++++++++ oci/catalog/apps/libre-closet.json | 303 ++++++++++ oci/catalog/apps/lifttrace.json | 353 ++++++++++++ oci/catalog/apps/maintainerr.json | 288 ++++++++++ oci/catalog/apps/notara.json | 303 ++++++++++ oci/catalog/apps/notetrace.json | 353 ++++++++++++ oci/catalog/apps/nutritrace.json | 353 ++++++++++++ oci/catalog/apps/opengist.json | 285 +++++++++ oci/catalog/apps/opentask.json | 276 +++++++++ oci/catalog/apps/papra.json | 302 ++++++++++ oci/catalog/apps/photofield.json | 298 ++++++++++ oci/catalog/apps/plants.json | 285 +++++++++ oci/catalog/apps/sofa.json | 321 +++++++++++ oci/catalog/apps/web-check.json | 238 ++++++++ oci/catalog/curated/artalk.json | 276 +++++++++ oci/catalog/curated/bichon.json | 313 ++++++++++ oci/catalog/curated/calnode.json | 333 +++++++++++ oci/catalog/curated/cooktrace.json | 353 ++++++++++++ oci/catalog/curated/degubase.json | 320 +++++++++++ oci/catalog/curated/flagr.json | 303 ++++++++++ oci/catalog/curated/guestroll.json | 307 ++++++++++ oci/catalog/curated/ihatemoney.json | 352 ++++++++++++ oci/catalog/curated/imagesilo.json | 296 ++++++++++ oci/catalog/curated/instatic.json | 368 ++++++++++++ oci/catalog/curated/invoiceshelf.json | 387 +++++++++++++ oci/catalog/curated/kroma.json | 311 ++++++++++ oci/catalog/curated/libre-closet.json | 303 ++++++++++ oci/catalog/curated/lifttrace.json | 353 ++++++++++++ oci/catalog/curated/maintainerr.json | 288 ++++++++++ oci/catalog/curated/notara.json | 303 ++++++++++ oci/catalog/curated/notetrace.json | 353 ++++++++++++ oci/catalog/curated/nutritrace.json | 353 ++++++++++++ oci/catalog/curated/opengist.json | 285 +++++++++ oci/catalog/curated/opentask.json | 276 +++++++++ oci/catalog/curated/papra.json | 302 ++++++++++ oci/catalog/curated/photofield.json | 298 ++++++++++ oci/catalog/curated/plants.json | 285 +++++++++ oci/catalog/curated/sofa.json | 321 +++++++++++ oci/catalog/curated/web-check.json | 238 ++++++++ oci/catalog/index.json | 799 +++++++++++++++++++++++++- 51 files changed, 16552 insertions(+), 1 deletion(-) create mode 100644 oci/catalog/apps/artalk.json create mode 100644 oci/catalog/apps/bichon.json create mode 100644 oci/catalog/apps/calnode.json create mode 100644 oci/catalog/apps/cooktrace.json create mode 100644 oci/catalog/apps/degubase.json create mode 100644 oci/catalog/apps/flagr.json create mode 100644 oci/catalog/apps/guestroll.json create mode 100644 oci/catalog/apps/ihatemoney.json create mode 100644 oci/catalog/apps/imagesilo.json create mode 100644 oci/catalog/apps/instatic.json create mode 100644 oci/catalog/apps/invoiceshelf.json create mode 100644 oci/catalog/apps/kroma.json create mode 100644 oci/catalog/apps/libre-closet.json create mode 100644 oci/catalog/apps/lifttrace.json create mode 100644 oci/catalog/apps/maintainerr.json create mode 100644 oci/catalog/apps/notara.json create mode 100644 oci/catalog/apps/notetrace.json create mode 100644 oci/catalog/apps/nutritrace.json create mode 100644 oci/catalog/apps/opengist.json create mode 100644 oci/catalog/apps/opentask.json create mode 100644 oci/catalog/apps/papra.json create mode 100644 oci/catalog/apps/photofield.json create mode 100644 oci/catalog/apps/plants.json create mode 100644 oci/catalog/apps/sofa.json create mode 100644 oci/catalog/apps/web-check.json create mode 100644 oci/catalog/curated/artalk.json create mode 100644 oci/catalog/curated/bichon.json create mode 100644 oci/catalog/curated/calnode.json create mode 100644 oci/catalog/curated/cooktrace.json create mode 100644 oci/catalog/curated/degubase.json create mode 100644 oci/catalog/curated/flagr.json create mode 100644 oci/catalog/curated/guestroll.json create mode 100644 oci/catalog/curated/ihatemoney.json create mode 100644 oci/catalog/curated/imagesilo.json create mode 100644 oci/catalog/curated/instatic.json create mode 100644 oci/catalog/curated/invoiceshelf.json create mode 100644 oci/catalog/curated/kroma.json create mode 100644 oci/catalog/curated/libre-closet.json create mode 100644 oci/catalog/curated/lifttrace.json create mode 100644 oci/catalog/curated/maintainerr.json create mode 100644 oci/catalog/curated/notara.json create mode 100644 oci/catalog/curated/notetrace.json create mode 100644 oci/catalog/curated/nutritrace.json create mode 100644 oci/catalog/curated/opengist.json create mode 100644 oci/catalog/curated/opentask.json create mode 100644 oci/catalog/curated/papra.json create mode 100644 oci/catalog/curated/photofield.json create mode 100644 oci/catalog/curated/plants.json create mode 100644 oci/catalog/curated/sofa.json create mode 100644 oci/catalog/curated/web-check.json diff --git a/oci/catalog/apps/artalk.json b/oci/catalog/apps/artalk.json new file mode 100644 index 00000000..d48110aa --- /dev/null +++ b/oci/catalog/apps/artalk.json @@ -0,0 +1,276 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-artalk", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Artalk" + }, + "description": { + "en_US": "Self-hosted comment server for blogs and websites, with a browser-based dashboard." + }, + "category": "documents", + "category_label": "Documents & Notes", + "author": "ArtalkJS", + "developer": "ArtalkJS", + "icon": "https://raw.githubusercontent.com/ArtalkJS/Artalk/master/docs/docs/images/artalk-logo.png", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 23366, + "path": "/" + }, + "website": "https://artalk.js.org/", + "documentation": "https://artalk.js.org/en/guide/deploy.html", + "repository": "https://github.com/ArtalkJS/Artalk", + "tips": [ + "Create the initial dashboard administrator from the container console with the upstream artalk admin command." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "ArtalkJS", + "repository": "https://github.com/ArtalkJS/Artalk", + "default_branch": "master", + "revision": "53d15ee0c3a908b4a58fc43f42c44b5e709279bd", + "image_repository_url": "https://hub.docker.com/r/artalk/artalk-go", + "readme_pushed_at": "", + "compose_sha256": "856f4fcf59914076799bc5774d1e69ab3d3da7d60c3b2598062864cd02552677", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/ArtalkJS/Artalk/master/README.md" + }, + "container_contract": { + "service_name": "artalk", + "container_name": "artalk", + "image": { + "reference": "docker.io/artalk/artalk-go:latest", + "registry": "docker.io", + "repository": "docker.io/artalk/artalk-go", + "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", + "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": 23366, + "published_example": 23366, + "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 \"name\": \"artalk\",\n \"services\": {\n \"artalk\": {\n \"image\": \"docker.io/artalk/artalk-go:latest\",\n \"container_name\": \"artalk\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"23366:23366/tcp\"\n ],\n \"volumes\": [\n \"./data:/data\"\n ]\n }\n }\n}" + }, + "compose_stack": { + "project_name": "artalk", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "artalk", + "service_count": 1, + "services": [ + { + "name": "artalk", + "image": "docker.io/artalk/artalk-go:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "docker.io/artalk/artalk-go:latest", + "container_name": "artalk", + "restart": "unless-stopped", + "ports": [ + "23366:23366/tcp" + ], + "volumes": [ + "./data:/data" + ] + } + } + ], + "top_level": {}, + "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": "artalk-volume-0", + "service": "artalk", + "container_path": "/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "artalk" + ], + "stop_order": [ + "artalk" + ], + "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": "Artalk", + "scheme": "http", + "port": 23366, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 23366, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/apps/bichon.json b/oci/catalog/apps/bichon.json new file mode 100644 index 00000000..1ac110fd --- /dev/null +++ b/oci/catalog/apps/bichon.json @@ -0,0 +1,313 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-bichon", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Bichon" + }, + "description": { + "en_US": "Self-hosted email archival and search server that downloads mailboxes over IMAP into encrypted local storage." + }, + "category": "communication", + "category_label": "Communication & Community", + "author": "rustmailer", + "developer": "rustmailer", + "icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/bichon.webp", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 15630, + "path": "/" + }, + "website": "https://github.com/rustmailer/bichon", + "documentation": "https://github.com/rustmailer/bichon#readme", + "repository": "https://github.com/rustmailer/bichon", + "tips": [ + "The upstream Docker command runs as UID:GID 1000:1000 and requires BICHON_ENCRYPT_PASSWORD. The initial web login is admin / admin@bichon; change it immediately." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "rustmailer", + "repository": "https://github.com/rustmailer/bichon", + "default_branch": "main", + "revision": "010e7dbd8ea1eceb478d6cee070c2156319e5685", + "image_repository_url": "https://hub.docker.com/r/rustmailer/bichon", + "readme_pushed_at": "", + "compose_sha256": "8e6b0d98f8fe7ff90ec4d092fc19ece93ba1f940b6690914c9fd6ab864729cdd", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/rustmailer/bichon/main/README.md" + }, + "container_contract": { + "service_name": "bichon", + "container_name": "bichon", + "image": { + "reference": "docker.io/rustmailer/bichon:latest", + "registry": "docker.io", + "repository": "docker.io/rustmailer/bichon", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "BICHON_ROOT_DIR", + "example": "/data", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "BICHON_ENCRYPT_PASSWORD", + "example": null, + "required": true, + "sensitive": true, + "source": "upstream-documentation" + }, + { + "name": "BICHON_LOG_LEVEL", + "example": "info", + "required": false, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/data", + "compose_source_example": "./bichon-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": 15630, + "published_example": 15630, + "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 \"name\": \"bichon\",\n \"services\": {\n \"bichon\": {\n \"image\": \"docker.io/rustmailer/bichon:latest\",\n \"container_name\": \"bichon\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"15630:15630/tcp\"\n ],\n \"volumes\": [\n \"./bichon-data:/data\"\n ],\n \"environment\": {\n \"BICHON_ROOT_DIR\": \"/data\",\n \"BICHON_ENCRYPT_PASSWORD\": null,\n \"BICHON_LOG_LEVEL\": \"info\"\n },\n \"user\": \"1000:1000\"\n }\n }\n}" + }, + "compose_stack": { + "project_name": "bichon", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "bichon", + "service_count": 1, + "services": [ + { + "name": "bichon", + "image": "docker.io/rustmailer/bichon:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "docker.io/rustmailer/bichon:latest", + "container_name": "bichon", + "restart": "unless-stopped", + "ports": [ + "15630:15630/tcp" + ], + "volumes": [ + "./bichon-data:/data" + ], + "environment": { + "BICHON_ROOT_DIR": "/data", + "BICHON_ENCRYPT_PASSWORD": null, + "BICHON_LOG_LEVEL": "info" + }, + "user": "1000:1000" + } + } + ], + "top_level": {}, + "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": "bichon-volume-0", + "service": "bichon", + "container_path": "/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "bichon" + ], + "stop_order": [ + "bichon" + ], + "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": "Bichon", + "scheme": "http", + "port": 15630, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [ + { + "label": "Bichon administrator", + "type": "static-default", + "username": "admin", + "password": "admin@bichon", + "change_required": true, + "source": "upstream-documentation" + } + ] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 15630, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/apps/calnode.json b/oci/catalog/apps/calnode.json new file mode 100644 index 00000000..dd723152 --- /dev/null +++ b/oci/catalog/apps/calnode.json @@ -0,0 +1,333 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-calnode", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Calnode" + }, + "description": { + "en_US": "Self-hosted scheduling and booking app with a built-in admin interface and SQLite database." + }, + "category": "productivity", + "category_label": "Productivity & Workflows", + "author": "Calnode", + "developer": "Calnode", + "icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/calnode.webp", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 3000, + "path": "/admin/" + }, + "website": "https://github.com/Calnode/calnode", + "documentation": "https://github.com/Calnode/calnode/blob/main/DEPLOY.md", + "repository": "https://github.com/Calnode/calnode", + "tips": [ + "The generated encryption and recovery secrets must be backed up with /data; losing them may make stored credentials unrecoverable. Configure HTTPS before enabling integrations that require secure origins." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "Calnode", + "repository": "https://github.com/Calnode/calnode", + "default_branch": "main", + "revision": "e0a942f8a7234c1dd28e1688ae35d3d6ec9f169f", + "image_repository_url": "https://github.com/orgs/calnode/packages/container/package/calnode", + "readme_pushed_at": "", + "compose_sha256": "719e5706269e843f00e5036390e9179253f64c472318cd5d960173cfb6dc03a8", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/Calnode/calnode/main/README.md" + }, + "container_contract": { + "service_name": "calnode", + "container_name": "calnode", + "image": { + "reference": "ghcr.io/calnode/calnode:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/calnode/calnode", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "CALNODE_ENCRYPTION_KEY", + "example": "${GENERATED_CALNODE_ENCRYPTION_KEY}", + "required": true, + "sensitive": true, + "source": "upstream-documentation" + }, + { + "name": "CALNODE_RECOVERY_SECRET", + "example": "${GENERATED_CALNODE_RECOVERY_SECRET}", + "required": true, + "sensitive": true, + "source": "upstream-documentation" + }, + { + "name": "DATABASE_URL", + "example": "sqlite:///data/calnode.db", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/data", + "compose_source_example": "./data", + "read_only": false, + "required": true, + "installation_choice": [ + "managed-volume", + "host-bind" + ], + "default": "managed-volume", + "managed_volume": { + "backup": true, + "default_size_gb": 8 + } + } + ], + "ports": [ + { + "container_port": 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": "{\n \"name\": \"calnode\",\n \"services\": {\n \"calnode\": {\n \"image\": \"ghcr.io/calnode/calnode:latest\",\n \"container_name\": \"calnode\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"3000:3000/tcp\"\n ],\n \"volumes\": [\n \"./data:/data\"\n ],\n \"environment\": {\n \"CALNODE_ENCRYPTION_KEY\": \"${GENERATED_CALNODE_ENCRYPTION_KEY}\",\n \"CALNODE_RECOVERY_SECRET\": \"${GENERATED_CALNODE_RECOVERY_SECRET}\",\n \"DATABASE_URL\": \"sqlite:///data/calnode.db\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "calnode", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "calnode", + "service_count": 1, + "services": [ + { + "name": "calnode", + "image": "ghcr.io/calnode/calnode:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/calnode/calnode:latest", + "container_name": "calnode", + "restart": "unless-stopped", + "ports": [ + "3000:3000/tcp" + ], + "volumes": [ + "./data:/data" + ], + "environment": { + "CALNODE_ENCRYPTION_KEY": "${GENERATED_CALNODE_ENCRYPTION_KEY}", + "CALNODE_RECOVERY_SECRET": "${GENERATED_CALNODE_RECOVERY_SECRET}", + "DATABASE_URL": "sqlite:///data/calnode.db" + } + } + } + ], + "top_level": {}, + "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": "calnode-volume-0", + "service": "calnode", + "container_path": "/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "calnode" + ], + "stop_order": [ + "calnode" + ], + "dependency_readiness": "compose-healthcheck-then-port-or-process-fallback", + "rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes" + }, + "installer_inputs": { + "prompted": [ + "stack_name", + "base_vmid", + "rootfs_storage", + "persistent_data_destinations", + "frontend_bridge", + "frontend_ipv4_mode" + ], + "automatic": [ + "dependent_vmids", + "private_bridge", + "private_subnet", + "private_service_addresses", + "compose_service_aliases", + "generated_secrets", + "dependency_start_and_stop_order" + ], + "generated_secrets": [ + { + "id": "generated-calnode-calnode-encryption-key", + "strategy": "generate-cryptographically-random-at-install", + "bindings": [ + { + "service": "calnode", + "environment_variable": "CALNODE_ENCRYPTION_KEY" + } + ] + }, + { + "id": "generated-calnode-calnode-recovery-secret", + "strategy": "generate-cryptographically-random-at-install", + "bindings": [ + { + "service": "calnode", + "environment_variable": "CALNODE_RECOVERY_SECRET" + } + ] + } + ] + } + }, + "first_run": { + "endpoints": [ + { + "label": "Calnode", + "scheme": "http", + "port": 3000, + "path": "/admin/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": { + "CALNODE_ENCRYPTION_KEY": { + "strategy": "token-hex", + "bytes": 32 + }, + "CALNODE_RECOVERY_SECRET": { + "strategy": "token-hex", + "bytes": 32 + } + }, + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 3000, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/apps/cooktrace.json b/oci/catalog/apps/cooktrace.json new file mode 100644 index 00000000..1a68c3af --- /dev/null +++ b/oci/catalog/apps/cooktrace.json @@ -0,0 +1,353 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-cooktrace", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "CookTrace" + }, + "description": { + "en_US": "Self-hosted recipe manager for collecting, organizing, and sharing recipes." + }, + "category": "productivity", + "category_label": "Productivity & Workflows", + "author": "TraceApps", + "developer": "TraceApps", + "icon": "https://raw.githubusercontent.com/traceapps/cooktrace/main/public/icons/icon-512.png", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 3003, + "path": "/" + }, + "website": "https://github.com/traceapps/cooktrace", + "documentation": "https://github.com/traceapps/cooktrace#readme", + "repository": "https://github.com/traceapps/cooktrace", + "tips": [ + "The first-run wizard creates the initial administrator account." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "TraceApps", + "repository": "https://github.com/traceapps/cooktrace", + "default_branch": "main", + "revision": "f2734f0c4547fa605a935b20bb8e1516a8c39ba9", + "image_repository_url": "https://github.com/orgs/traceapps/packages/container/package/cooktrace", + "readme_pushed_at": "", + "compose_sha256": "97c6d80a15b18ba20e2740bd61220cb6907434a33ada01ffac476ebe89861989", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/traceapps/cooktrace/main/README.md" + }, + "container_contract": { + "service_name": "cooktrace", + "container_name": "cooktrace", + "image": { + "reference": "ghcr.io/traceapps/cooktrace:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/traceapps/cooktrace", + "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": "upstream-documentation" + }, + { + "name": "DB_PATH", + "example": "/data/db/cooktrace.db", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "UPLOADS_PATH", + "example": "/data/uploads", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/data/db", + "compose_source_example": "./data/db", + "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/uploads", + "compose_source_example": "./data/uploads", + "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": 3003, + "published_example": 3003, + "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 \"name\": \"cooktrace\",\n \"services\": {\n \"cooktrace\": {\n \"image\": \"ghcr.io/traceapps/cooktrace:latest\",\n \"container_name\": \"cooktrace\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"3003:3003/tcp\"\n ],\n \"volumes\": [\n \"./data/db:/data/db\",\n \"./data/uploads:/data/uploads\"\n ],\n \"environment\": {\n \"JWT_SECRET\": \"${GENERATED_JWT_SECRET}\",\n \"DB_PATH\": \"/data/db/cooktrace.db\",\n \"UPLOADS_PATH\": \"/data/uploads\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "cooktrace", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "cooktrace", + "service_count": 1, + "services": [ + { + "name": "cooktrace", + "image": "ghcr.io/traceapps/cooktrace:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/traceapps/cooktrace:latest", + "container_name": "cooktrace", + "restart": "unless-stopped", + "ports": [ + "3003:3003/tcp" + ], + "volumes": [ + "./data/db:/data/db", + "./data/uploads:/data/uploads" + ], + "environment": { + "JWT_SECRET": "${GENERATED_JWT_SECRET}", + "DB_PATH": "/data/db/cooktrace.db", + "UPLOADS_PATH": "/data/uploads" + } + } + } + ], + "top_level": {}, + "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": "cooktrace-volume-0", + "service": "cooktrace", + "container_path": "/data/db", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + }, + { + "id": "cooktrace-volume-1", + "service": "cooktrace", + "container_path": "/data/uploads", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "cooktrace" + ], + "stop_order": [ + "cooktrace" + ], + "dependency_readiness": "compose-healthcheck-then-port-or-process-fallback", + "rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes" + }, + "installer_inputs": { + "prompted": [ + "stack_name", + "base_vmid", + "rootfs_storage", + "persistent_data_destinations", + "frontend_bridge", + "frontend_ipv4_mode" + ], + "automatic": [ + "dependent_vmids", + "private_bridge", + "private_subnet", + "private_service_addresses", + "compose_service_aliases", + "generated_secrets", + "dependency_start_and_stop_order" + ], + "generated_secrets": [ + { + "id": "generated-cooktrace-jwt-secret", + "strategy": "generate-cryptographically-random-at-install", + "bindings": [ + { + "service": "cooktrace", + "environment_variable": "JWT_SECRET" + } + ] + } + ] + } + }, + "first_run": { + "endpoints": [ + { + "label": "CookTrace", + "scheme": "http", + "port": 3003, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": { + "JWT_SECRET": { + "strategy": "token-hex", + "bytes": 48 + } + }, + "volume_preparations": [ + { + "container_path": "/data/db", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data/uploads", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 3003, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/apps/degubase.json b/oci/catalog/apps/degubase.json new file mode 100644 index 00000000..92fd2c3d --- /dev/null +++ b/oci/catalog/apps/degubase.json @@ -0,0 +1,320 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-degubase", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Degubase" + }, + "description": { + "en_US": "A single-container web interface for building small relational workspaces backed by SQLite." + }, + "category": "databases", + "category_label": "Databases", + "author": "saintedlama", + "developer": "saintedlama", + "icon": "https://raw.githubusercontent.com/saintedlama/degubase/main/ui/public/assets/logo.svg", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64" + ], + "launch": { + "scheme": "http", + "port": 8080, + "path": "/" + }, + "website": "https://github.com/saintedlama/degubase", + "documentation": "https://github.com/saintedlama/degubase#readme", + "repository": "https://github.com/saintedlama/degubase", + "tips": [ + "The image stores workspace data under /data and configuration under /config. Authentication is configurable; review its security settings before publishing it." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "saintedlama", + "repository": "https://github.com/saintedlama/degubase", + "default_branch": "main", + "revision": "173257a2b0567ba91eef7454f174db9265f0f26c", + "image_repository_url": "https://github.com/orgs/saintedlama/packages/container/package/degubase", + "readme_pushed_at": "", + "compose_sha256": "f42e7bf9286f453d71411ffd69d9b18da1b209d51ef6f263f2ae60c7bc7e8616", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/saintedlama/degubase/main/README.md" + }, + "container_contract": { + "service_name": "degubase", + "container_name": "degubase", + "image": { + "reference": "ghcr.io/saintedlama/degubase:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/saintedlama/degubase", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "DEGUBASE_HOST", + "example": "0.0.0.0", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/data", + "compose_source_example": "./data", + "read_only": false, + "required": true, + "installation_choice": [ + "managed-volume", + "host-bind" + ], + "default": "managed-volume", + "managed_volume": { + "backup": true, + "default_size_gb": 4 + } + }, + { + "id": "volume-1", + "container_path": "/config", + "compose_source_example": "./config", + "read_only": false, + "required": true, + "installation_choice": [ + "managed-volume", + "host-bind" + ], + "default": "managed-volume", + "managed_volume": { + "backup": true, + "default_size_gb": 2 + } + } + ], + "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": "{\n \"name\": \"degubase\",\n \"services\": {\n \"degubase\": {\n \"image\": \"ghcr.io/saintedlama/degubase:latest\",\n \"container_name\": \"degubase\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"8080:8080/tcp\"\n ],\n \"volumes\": [\n \"./data:/data\",\n \"./config:/config\"\n ],\n \"environment\": {\n \"DEGUBASE_HOST\": \"0.0.0.0\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "degubase", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "degubase", + "service_count": 1, + "services": [ + { + "name": "degubase", + "image": "ghcr.io/saintedlama/degubase:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/saintedlama/degubase:latest", + "container_name": "degubase", + "restart": "unless-stopped", + "ports": [ + "8080:8080/tcp" + ], + "volumes": [ + "./data:/data", + "./config:/config" + ], + "environment": { + "DEGUBASE_HOST": "0.0.0.0" + } + } + } + ], + "top_level": {}, + "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": "degubase-volume-0", + "service": "degubase", + "container_path": "/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + }, + { + "id": "degubase-volume-1", + "service": "degubase", + "container_path": "/config", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "degubase" + ], + "stop_order": [ + "degubase" + ], + "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": "Degubase", + "scheme": "http", + "port": 8080, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 8080, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/apps/flagr.json b/oci/catalog/apps/flagr.json new file mode 100644 index 00000000..f931cd3b --- /dev/null +++ b/oci/catalog/apps/flagr.json @@ -0,0 +1,303 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-flagr", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Flagr" + }, + "description": { + "en_US": "Self-hosted feature-flag and experimentation service with a web interface and SQLite defaults." + }, + "category": "ai", + "category_label": "AI / Coding & Dev-Tools", + "author": "openflagr", + "developer": "openflagr", + "icon": "https://raw.githubusercontent.com/openflagr/flagr/main/docs/brand/flagr-mark.png", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 18000, + "path": "/" + }, + "website": "https://github.com/openflagr/flagr", + "documentation": "https://github.com/openflagr/flagr/blob/main/docs/flagr_self_host.md", + "repository": "https://github.com/openflagr/flagr", + "tips": [ + "This profile uses Flagr's built-in SQLite mode; no MySQL or PostgreSQL service is required." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "openflagr", + "repository": "https://github.com/openflagr/flagr", + "default_branch": "main", + "revision": "e026211babf05b0cc3431b6deb565f65df7ae3c7", + "image_repository_url": "https://github.com/orgs/openflagr/packages/container/package/flagr", + "readme_pushed_at": "", + "compose_sha256": "ec4044f5b9f5c33c67ed266efd16be2b0d4c929c7a6ce7fa3b03d858fc0f93d5", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/openflagr/flagr/main/README.md" + }, + "container_contract": { + "service_name": "flagr", + "container_name": "flagr", + "image": { + "reference": "ghcr.io/openflagr/flagr:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/openflagr/flagr", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "HOST", + "example": "0.0.0.0", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "FLAGR_DB_DBDRIVER", + "example": "sqlite3", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "FLAGR_DB_DBCONNECTIONSTR", + "example": "/data/flagr.sqlite", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/data", + "compose_source_example": "./data", + "read_only": false, + "required": true, + "installation_choice": [ + "managed-volume", + "host-bind" + ], + "default": "managed-volume", + "managed_volume": { + "backup": true, + "default_size_gb": 4 + } + } + ], + "ports": [ + { + "container_port": 18000, + "published_example": 18000, + "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 \"name\": \"flagr\",\n \"services\": {\n \"flagr\": {\n \"image\": \"ghcr.io/openflagr/flagr:latest\",\n \"container_name\": \"flagr\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"18000:18000/tcp\"\n ],\n \"volumes\": [\n \"./data:/data\"\n ],\n \"environment\": {\n \"HOST\": \"0.0.0.0\",\n \"FLAGR_DB_DBDRIVER\": \"sqlite3\",\n \"FLAGR_DB_DBCONNECTIONSTR\": \"/data/flagr.sqlite\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "flagr", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "flagr", + "service_count": 1, + "services": [ + { + "name": "flagr", + "image": "ghcr.io/openflagr/flagr:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/openflagr/flagr:latest", + "container_name": "flagr", + "restart": "unless-stopped", + "ports": [ + "18000:18000/tcp" + ], + "volumes": [ + "./data:/data" + ], + "environment": { + "HOST": "0.0.0.0", + "FLAGR_DB_DBDRIVER": "sqlite3", + "FLAGR_DB_DBCONNECTIONSTR": "/data/flagr.sqlite" + } + } + } + ], + "top_level": {}, + "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": "flagr-volume-0", + "service": "flagr", + "container_path": "/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "flagr" + ], + "stop_order": [ + "flagr" + ], + "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": "Flagr", + "scheme": "http", + "port": 18000, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 18000, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/apps/guestroll.json b/oci/catalog/apps/guestroll.json new file mode 100644 index 00000000..48d2edbb --- /dev/null +++ b/oci/catalog/apps/guestroll.json @@ -0,0 +1,307 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-guestroll", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Guestroll" + }, + "description": { + "en_US": "Self-hosted event photo gallery for guests, with moderation, QR-code sharing, and local SQLite storage." + }, + "category": "sharing", + "category_label": "Files & Sharing", + "author": "achedon12", + "developer": "achedon12", + "icon": "https://raw.githubusercontent.com/achedon12/guestroll/develop/src/app/icon.svg", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 3000, + "path": "/admin" + }, + "website": "https://github.com/achedon12/guestroll", + "documentation": "https://github.com/achedon12/guestroll#readme", + "repository": "https://github.com/achedon12/guestroll", + "tips": [ + "Sign in as admin at /admin. ADMIN_PASSWORD is requested at installation; PUBLIC_URL is initially set to the local LXC address.", + "Mobile camera access requires HTTPS; configure a reverse proxy before using that feature at an event." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "achedon12", + "repository": "https://github.com/achedon12/guestroll", + "default_branch": "develop", + "revision": "3fc407dd872a3e649b7ba505e2e6d80cefb9b82a", + "image_repository_url": "https://github.com/orgs/achedon12/packages/container/package/guestroll", + "readme_pushed_at": "", + "compose_sha256": "a02f45b0aacaf2a5e35a4554f3e35b547dc38011e693390d15f82f6c991c84e5", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/achedon12/guestroll/develop/README.md" + }, + "container_contract": { + "service_name": "guestroll", + "container_name": "guestroll", + "image": { + "reference": "ghcr.io/achedon12/guestroll:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/achedon12/guestroll", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "ADMIN_PASSWORD", + "example": null, + "required": true, + "sensitive": true, + "source": "upstream-documentation" + }, + { + "name": "PUBLIC_URL", + "example": "http://@CONTAINER_ADDRESS@:3000", + "required": true, + "sensitive": false, + "container_address": "http://@CONTAINER_ADDRESS@:3000", + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/data", + "compose_source_example": "./data", + "read_only": false, + "required": true, + "installation_choice": [ + "managed-volume", + "host-bind" + ], + "default": "managed-volume", + "managed_volume": { + "backup": true, + "default_size_gb": 8 + } + } + ], + "ports": [ + { + "container_port": 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": "{\n \"name\": \"guestroll\",\n \"services\": {\n \"guestroll\": {\n \"image\": \"ghcr.io/achedon12/guestroll:latest\",\n \"container_name\": \"guestroll\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"3000:3000/tcp\"\n ],\n \"volumes\": [\n \"./data:/data\"\n ],\n \"environment\": {\n \"ADMIN_PASSWORD\": null,\n \"PUBLIC_URL\": \"http://@CONTAINER_ADDRESS@:3000\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "guestroll", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "guestroll", + "service_count": 1, + "services": [ + { + "name": "guestroll", + "image": "ghcr.io/achedon12/guestroll:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/achedon12/guestroll:latest", + "container_name": "guestroll", + "restart": "unless-stopped", + "ports": [ + "3000:3000/tcp" + ], + "volumes": [ + "./data:/data" + ], + "environment": { + "ADMIN_PASSWORD": null, + "PUBLIC_URL": "http://@CONTAINER_ADDRESS@:3000" + } + } + } + ], + "top_level": {}, + "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": "guestroll-volume-0", + "service": "guestroll", + "container_path": "/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "guestroll" + ], + "stop_order": [ + "guestroll" + ], + "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": "Guestroll", + "scheme": "http", + "port": 3000, + "path": "/admin", + "source": "upstream-documentation" + } + ], + "credentials": [ + { + "label": "Guestroll administrator", + "type": "configured-or-installer-generated", + "username": "admin", + "password": null, + "password_environment": "ADMIN_PASSWORD", + "change_required": false, + "source": "upstream-documentation" + } + ] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 3000, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/apps/ihatemoney.json b/oci/catalog/apps/ihatemoney.json new file mode 100644 index 00000000..ba115bbd --- /dev/null +++ b/oci/catalog/apps/ihatemoney.json @@ -0,0 +1,352 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-ihatemoney", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "I Hate Money" + }, + "description": { + "en_US": "Self-hosted shared-expense and group-budget manager for tracking purchases and settling who owes whom." + }, + "category": "finance", + "category_label": "Finance & Budgeting", + "author": "spiral-project", + "developer": "spiral-project", + "icon": "https://raw.githubusercontent.com/spiral-project/ihatemoney/main/ihatemoney/static/favicon.ico", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 8000, + "path": "/" + }, + "website": "https://ihatemoney.org/", + "documentation": "https://ihatemoney.readthedocs.io/en/latest/installation.html#with-docker", + "repository": "https://github.com/spiral-project/ihatemoney", + "tips": [ + "The profile keeps the upstream admin dashboard disabled and public project creation enabled for the initial setup. Do not expose it publicly without reviewing those access settings.", + "The project is currently maintained with a focus on stability and maintenance rather than major new features." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "spiral-project", + "repository": "https://github.com/spiral-project/ihatemoney", + "default_branch": "main", + "revision": "e66a7672e8e5c41549bf53c4a824c72c43ab9079", + "image_repository_url": "https://hub.docker.com/r/ihatemoney/ihatemoney", + "readme_pushed_at": "", + "compose_sha256": "8a8be316e105a542379edca87eafadd0b9f42d980067b39ddcdab4fa71fce9c3", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/spiral-project/ihatemoney/main/README.md" + }, + "container_contract": { + "service_name": "ihatemoney", + "container_name": "ihatemoney", + "image": { + "reference": "docker.io/ihatemoney/ihatemoney:latest", + "registry": "docker.io", + "repository": "docker.io/ihatemoney/ihatemoney", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "SECRET_KEY", + "example": "${GENERATED_SECRET_KEY}", + "required": true, + "sensitive": true, + "source": "upstream-documentation" + }, + { + "name": "SQLALCHEMY_DATABASE_URI", + "example": "sqlite:////database/ihatemoney.db", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "SESSION_COOKIE_SECURE", + "example": "False", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "ACTIVATE_DEMO_PROJECT", + "example": "True", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "ACTIVATE_ADMIN_DASHBOARD", + "example": "False", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "ALLOW_PUBLIC_PROJECT_CREATION", + "example": "True", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "PORT", + "example": "8000", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/database", + "compose_source_example": "./database", + "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": "{\n \"name\": \"ihatemoney\",\n \"services\": {\n \"ihatemoney\": {\n \"image\": \"docker.io/ihatemoney/ihatemoney:latest\",\n \"container_name\": \"ihatemoney\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"8000:8000/tcp\"\n ],\n \"volumes\": [\n \"./database:/database\"\n ],\n \"environment\": {\n \"SECRET_KEY\": \"${GENERATED_SECRET_KEY}\",\n \"SQLALCHEMY_DATABASE_URI\": \"sqlite:////database/ihatemoney.db\",\n \"SESSION_COOKIE_SECURE\": \"False\",\n \"ACTIVATE_DEMO_PROJECT\": \"True\",\n \"ACTIVATE_ADMIN_DASHBOARD\": \"False\",\n \"ALLOW_PUBLIC_PROJECT_CREATION\": \"True\",\n \"PORT\": \"8000\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "ihatemoney", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "ihatemoney", + "service_count": 1, + "services": [ + { + "name": "ihatemoney", + "image": "docker.io/ihatemoney/ihatemoney:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "docker.io/ihatemoney/ihatemoney:latest", + "container_name": "ihatemoney", + "restart": "unless-stopped", + "ports": [ + "8000:8000/tcp" + ], + "volumes": [ + "./database:/database" + ], + "environment": { + "SECRET_KEY": "${GENERATED_SECRET_KEY}", + "SQLALCHEMY_DATABASE_URI": "sqlite:////database/ihatemoney.db", + "SESSION_COOKIE_SECURE": "False", + "ACTIVATE_DEMO_PROJECT": "True", + "ACTIVATE_ADMIN_DASHBOARD": "False", + "ALLOW_PUBLIC_PROJECT_CREATION": "True", + "PORT": "8000" + } + } + } + ], + "top_level": {}, + "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": "ihatemoney-volume-0", + "service": "ihatemoney", + "container_path": "/database", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "ihatemoney" + ], + "stop_order": [ + "ihatemoney" + ], + "dependency_readiness": "compose-healthcheck-then-port-or-process-fallback", + "rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes" + }, + "installer_inputs": { + "prompted": [ + "stack_name", + "base_vmid", + "rootfs_storage", + "persistent_data_destinations", + "frontend_bridge", + "frontend_ipv4_mode" + ], + "automatic": [ + "dependent_vmids", + "private_bridge", + "private_subnet", + "private_service_addresses", + "compose_service_aliases", + "generated_secrets", + "dependency_start_and_stop_order" + ], + "generated_secrets": [ + { + "id": "generated-ihatemoney-secret-key", + "strategy": "generate-cryptographically-random-at-install", + "bindings": [ + { + "service": "ihatemoney", + "environment_variable": "SECRET_KEY" + } + ] + } + ] + } + }, + "first_run": { + "endpoints": [ + { + "label": "I Hate Money", + "scheme": "http", + "port": 8000, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": { + "SECRET_KEY": { + "strategy": "token-hex", + "bytes": 32 + } + }, + "volume_preparations": [ + { + "container_path": "/database", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 8000, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/apps/imagesilo.json b/oci/catalog/apps/imagesilo.json new file mode 100644 index 00000000..36a00fff --- /dev/null +++ b/oci/catalog/apps/imagesilo.json @@ -0,0 +1,296 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-imagesilo", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "ImageSilo" + }, + "description": { + "en_US": "Self-hosted image-hosting service with authenticated uploads, image processing, public links, and local storage." + }, + "category": "sharing", + "category_label": "Files & Sharing", + "author": "Willxup", + "developer": "Willxup", + "icon": "https://raw.githubusercontent.com/Willxup/imagesilo/main/assets/brand/imagesilo-icon-512.png", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 8080, + "path": "/admin/setup" + }, + "website": "https://github.com/Willxup/imagesilo", + "documentation": "https://github.com/Willxup/imagesilo/blob/main/README.md", + "repository": "https://github.com/Willxup/imagesilo", + "tips": [ + "On first start, retrieve the one-time bootstrap token from the container log and enter it at /admin/setup to create the administrator.", + "Set IMAGESILO_COOKIE_SECURE=true when accessing the service through HTTPS." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "Willxup", + "repository": "https://github.com/Willxup/imagesilo", + "default_branch": "main", + "revision": "aecbdc402011f8a4bb8d0a4469786ab48db7d88a", + "image_repository_url": "https://github.com/orgs/Willxup/packages/container/package/imagesilo", + "readme_pushed_at": "", + "compose_sha256": "b1d73df6458fe0fb2c891f4f32eca925836c132ebbbccee9f95962ad0e4b7121", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/Willxup/imagesilo/main/README.md" + }, + "container_contract": { + "service_name": "imagesilo", + "container_name": "imagesilo", + "image": { + "reference": "ghcr.io/willxup/imagesilo:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/willxup/imagesilo", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "IMAGESILO_COOKIE_SECURE", + "example": "false", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "IMAGESILO_PROCESSING_CONCURRENCY", + "example": "1", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/data", + "compose_source_example": "./data", + "read_only": false, + "required": true, + "installation_choice": [ + "managed-volume", + "host-bind" + ], + "default": "managed-volume", + "managed_volume": { + "backup": true, + "default_size_gb": 8 + } + } + ], + "ports": [ + { + "container_port": 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": "{\n \"name\": \"imagesilo\",\n \"services\": {\n \"imagesilo\": {\n \"image\": \"ghcr.io/willxup/imagesilo:latest\",\n \"container_name\": \"imagesilo\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"8080:8080/tcp\"\n ],\n \"volumes\": [\n \"./data:/data\"\n ],\n \"environment\": {\n \"IMAGESILO_COOKIE_SECURE\": \"false\",\n \"IMAGESILO_PROCESSING_CONCURRENCY\": \"1\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "imagesilo", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "imagesilo", + "service_count": 1, + "services": [ + { + "name": "imagesilo", + "image": "ghcr.io/willxup/imagesilo:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/willxup/imagesilo:latest", + "container_name": "imagesilo", + "restart": "unless-stopped", + "ports": [ + "8080:8080/tcp" + ], + "volumes": [ + "./data:/data" + ], + "environment": { + "IMAGESILO_COOKIE_SECURE": "false", + "IMAGESILO_PROCESSING_CONCURRENCY": "1" + } + } + } + ], + "top_level": {}, + "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": "imagesilo-volume-0", + "service": "imagesilo", + "container_path": "/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "imagesilo" + ], + "stop_order": [ + "imagesilo" + ], + "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": "ImageSilo", + "scheme": "http", + "port": 8080, + "path": "/admin/setup", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 8080, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/apps/instatic.json b/oci/catalog/apps/instatic.json new file mode 100644 index 00000000..a993296d --- /dev/null +++ b/oci/catalog/apps/instatic.json @@ -0,0 +1,368 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-instatic", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Instatic" + }, + "description": { + "en_US": "Single-server website CMS and visual editor with SQLite-backed content, media uploads, forms, and publishing." + }, + "category": "web", + "category_label": "Webservers & Proxies", + "author": "CoreBunch", + "developer": "CoreBunch", + "icon": "https://raw.githubusercontent.com/CoreBunch/Instatic/main/public/favicon.svg", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64" + ], + "launch": { + "scheme": "http", + "port": 3001, + "path": "/admin" + }, + "website": "https://github.com/CoreBunch/Instatic", + "documentation": "https://github.com/CoreBunch/Instatic/blob/main/docs/deployment/vps.md", + "repository": "https://github.com/CoreBunch/Instatic", + "tips": [ + "The initial visit at /admin creates the site and administrator. INSTATIC_SECRET_KEY is generated and persisted with the recipe; back up the volume." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "CoreBunch", + "repository": "https://github.com/CoreBunch/Instatic", + "default_branch": "main", + "revision": "1a7ab33ff1614e80b2f618b284dd55b0e2b9d9ae", + "image_repository_url": "https://github.com/orgs/CoreBunch/packages/container/package/instatic", + "readme_pushed_at": "", + "compose_sha256": "b8b34bcb67ace12f558f3a93b2363bfd525992ea66c9dd89b9cb53258087a16f", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/CoreBunch/Instatic/main/README.md" + }, + "container_contract": { + "service_name": "instatic", + "container_name": "instatic", + "image": { + "reference": "ghcr.io/corebunch/instatic:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/corebunch/instatic", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "PORT", + "example": "3001", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "DATABASE_URL", + "example": "sqlite:/app/data/cms.db", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "UPLOADS_DIR", + "example": "/app/uploads", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "STATIC_DIR", + "example": "/app/dist", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "INSTATIC_SECRET_KEY", + "example": "${GENERATED_INSTATIC_SECRET_KEY}", + "required": true, + "sensitive": true, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/app/data", + "compose_source_example": "./data", + "read_only": false, + "required": true, + "installation_choice": [ + "managed-volume", + "host-bind" + ], + "default": "managed-volume", + "managed_volume": { + "backup": true, + "default_size_gb": 8 + } + }, + { + "id": "volume-1", + "container_path": "/app/uploads", + "compose_source_example": "./uploads", + "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": 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": "{\n \"name\": \"instatic\",\n \"services\": {\n \"instatic\": {\n \"image\": \"ghcr.io/corebunch/instatic:latest\",\n \"container_name\": \"instatic\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"3001:3001/tcp\"\n ],\n \"volumes\": [\n \"./data:/app/data\",\n \"./uploads:/app/uploads\"\n ],\n \"environment\": {\n \"PORT\": \"3001\",\n \"DATABASE_URL\": \"sqlite:/app/data/cms.db\",\n \"UPLOADS_DIR\": \"/app/uploads\",\n \"STATIC_DIR\": \"/app/dist\",\n \"INSTATIC_SECRET_KEY\": \"${GENERATED_INSTATIC_SECRET_KEY}\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "instatic", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "instatic", + "service_count": 1, + "services": [ + { + "name": "instatic", + "image": "ghcr.io/corebunch/instatic:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/corebunch/instatic:latest", + "container_name": "instatic", + "restart": "unless-stopped", + "ports": [ + "3001:3001/tcp" + ], + "volumes": [ + "./data:/app/data", + "./uploads:/app/uploads" + ], + "environment": { + "PORT": "3001", + "DATABASE_URL": "sqlite:/app/data/cms.db", + "UPLOADS_DIR": "/app/uploads", + "STATIC_DIR": "/app/dist", + "INSTATIC_SECRET_KEY": "${GENERATED_INSTATIC_SECRET_KEY}" + } + } + } + ], + "top_level": {}, + "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": "instatic-volume-0", + "service": "instatic", + "container_path": "/app/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + }, + { + "id": "instatic-volume-1", + "service": "instatic", + "container_path": "/app/uploads", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "instatic" + ], + "stop_order": [ + "instatic" + ], + "dependency_readiness": "compose-healthcheck-then-port-or-process-fallback", + "rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes" + }, + "installer_inputs": { + "prompted": [ + "stack_name", + "base_vmid", + "rootfs_storage", + "persistent_data_destinations", + "frontend_bridge", + "frontend_ipv4_mode" + ], + "automatic": [ + "dependent_vmids", + "private_bridge", + "private_subnet", + "private_service_addresses", + "compose_service_aliases", + "generated_secrets", + "dependency_start_and_stop_order" + ], + "generated_secrets": [ + { + "id": "generated-instatic-instatic-secret-key", + "strategy": "generate-cryptographically-random-at-install", + "bindings": [ + { + "service": "instatic", + "environment_variable": "INSTATIC_SECRET_KEY" + } + ] + } + ] + } + }, + "first_run": { + "endpoints": [ + { + "label": "Instatic", + "scheme": "http", + "port": 3001, + "path": "/admin", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": { + "INSTATIC_SECRET_KEY": { + "strategy": "token-hex", + "bytes": 24 + } + }, + "volume_preparations": [ + { + "container_path": "/app/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/app/uploads", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 3001, + "path": "/health", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/apps/invoiceshelf.json b/oci/catalog/apps/invoiceshelf.json new file mode 100644 index 00000000..2690d539 --- /dev/null +++ b/oci/catalog/apps/invoiceshelf.json @@ -0,0 +1,387 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-invoiceshelf", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "InvoiceShelf" + }, + "description": { + "en_US": "Self-hosted invoicing and estimates with customer portals, recurring billing, payments, and expense tracking." + }, + "category": "business", + "category_label": "Business & ERP", + "author": "InvoiceShelf", + "developer": "InvoiceShelf", + "icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/invoiceshelf.webp", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 8080, + "path": "/" + }, + "website": "https://github.com/InvoiceShelf/InvoiceShelf", + "documentation": "https://github.com/InvoiceShelf/docker#readme", + "repository": "https://github.com/InvoiceShelf/InvoiceShelf", + "tips": [ + "The initial visit opens the setup wizard. The SQLite database is stored under /var/www/html/storage.", + "The upstream Docker image includes the web server and scheduler in one image; there is no database or scheduler container to add." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "InvoiceShelf", + "repository": "https://github.com/InvoiceShelf/docker", + "default_branch": "master", + "revision": "479f2396569959064fc6ca7a2bb36af30920d199", + "image_repository_url": "https://hub.docker.com/r/invoiceshelf/invoiceshelf", + "readme_pushed_at": "", + "compose_sha256": "5c855909373c8b9a8f3c4997fd24e06d8f11f303a2f318ddf084b6185efc43b4", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/InvoiceShelf/docker/master/README.md" + }, + "container_contract": { + "service_name": "invoiceshelf", + "container_name": "invoiceshelf", + "image": { + "reference": "docker.io/invoiceshelf/invoiceshelf:latest", + "registry": "docker.io", + "repository": "docker.io/invoiceshelf/invoiceshelf", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "APP_NAME", + "example": "InvoiceShelf", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "APP_ENV", + "example": "production", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "APP_DEBUG", + "example": "false", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "APP_URL", + "example": "http://@CONTAINER_ADDRESS@:8080", + "required": true, + "sensitive": false, + "container_address": "http://@CONTAINER_ADDRESS@:8080", + "source": "upstream-documentation" + }, + { + "name": "DB_CONNECTION", + "example": "sqlite", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "DB_DATABASE", + "example": "/var/www/html/storage/app/database.sqlite", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "CACHE_STORE", + "example": "file", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "SESSION_DRIVER", + "example": "file", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "SESSION_LIFETIME", + "example": "240", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/var/www/html/storage", + "compose_source_example": "./invoiceshelf/storage", + "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/html/Modules", + "compose_source_example": "./invoiceshelf/modules", + "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": 8090, + "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 \"name\": \"invoiceshelf\",\n \"services\": {\n \"invoiceshelf\": {\n \"image\": \"docker.io/invoiceshelf/invoiceshelf:latest\",\n \"container_name\": \"invoiceshelf\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"8090:8080/tcp\"\n ],\n \"volumes\": [\n \"./invoiceshelf/storage:/var/www/html/storage\",\n \"./invoiceshelf/modules:/var/www/html/Modules\"\n ],\n \"environment\": {\n \"APP_NAME\": \"InvoiceShelf\",\n \"APP_ENV\": \"production\",\n \"APP_DEBUG\": \"false\",\n \"APP_URL\": \"http://@CONTAINER_ADDRESS@:8080\",\n \"DB_CONNECTION\": \"sqlite\",\n \"DB_DATABASE\": \"/var/www/html/storage/app/database.sqlite\",\n \"CACHE_STORE\": \"file\",\n \"SESSION_DRIVER\": \"file\",\n \"SESSION_LIFETIME\": \"240\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "invoiceshelf", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "invoiceshelf", + "service_count": 1, + "services": [ + { + "name": "invoiceshelf", + "image": "docker.io/invoiceshelf/invoiceshelf:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "docker.io/invoiceshelf/invoiceshelf:latest", + "container_name": "invoiceshelf", + "restart": "unless-stopped", + "ports": [ + "8090:8080/tcp" + ], + "volumes": [ + "./invoiceshelf/storage:/var/www/html/storage", + "./invoiceshelf/modules:/var/www/html/Modules" + ], + "environment": { + "APP_NAME": "InvoiceShelf", + "APP_ENV": "production", + "APP_DEBUG": "false", + "APP_URL": "http://@CONTAINER_ADDRESS@:8080", + "DB_CONNECTION": "sqlite", + "DB_DATABASE": "/var/www/html/storage/app/database.sqlite", + "CACHE_STORE": "file", + "SESSION_DRIVER": "file", + "SESSION_LIFETIME": "240" + } + } + } + ], + "top_level": {}, + "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": "invoiceshelf-volume-0", + "service": "invoiceshelf", + "container_path": "/var/www/html/storage", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + }, + { + "id": "invoiceshelf-volume-1", + "service": "invoiceshelf", + "container_path": "/var/www/html/Modules", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "invoiceshelf" + ], + "stop_order": [ + "invoiceshelf" + ], + "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": "InvoiceShelf", + "scheme": "http", + "port": 8080, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [ + { + "container_path": "/var/www/html/storage", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/var/www/html/Modules", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 8080, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/apps/kroma.json b/oci/catalog/apps/kroma.json new file mode 100644 index 00000000..83697bca --- /dev/null +++ b/oci/catalog/apps/kroma.json @@ -0,0 +1,311 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-kroma", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "KROMA" + }, + "description": { + "en_US": "Personal media server for browsing and playing a local video library, with direct play and optional modules." + }, + "category": "media", + "category_label": "Media & Streaming", + "author": "kromatv", + "developer": "kromatv", + "icon": "https://raw.githubusercontent.com/kromatv/kroma/main/.github/assets/logo.svg", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 4040, + "path": "/" + }, + "website": "https://github.com/kromatv/kroma", + "documentation": "https://github.com/kromatv/kroma#readme", + "repository": "https://github.com/kromatv/kroma", + "tips": [ + "Without KROMA_MEDIA_DIRS configured, the server seeds demo titles. To browse your own library, add a host media directory at /media and configure KROMA_MEDIA_DIRS=/media.", + "KROMA modules can start additional processes when enabled; this profile installs only the base server image." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "kromatv", + "repository": "https://github.com/kromatv/kroma", + "default_branch": "main", + "revision": "616024831f332d3c24a6ebc6afc2dd5a1148b63f", + "image_repository_url": "https://github.com/orgs/kromatv/packages/container/package/kroma", + "readme_pushed_at": "", + "compose_sha256": "0eef24d6d6c187a1188ba00183d7a8f4dc7244e1ca13dea3dbf5fc57e9c6c3d6", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/kromatv/kroma/main/README.md" + }, + "container_contract": { + "service_name": "kroma", + "container_name": "kroma", + "image": { + "reference": "ghcr.io/kromatv/kroma:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/kromatv/kroma", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "KROMA_MEDIA_DIRS", + "example": "/media", + "required": false, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/data", + "compose_source_example": "./data", + "read_only": false, + "required": true, + "installation_choice": [ + "managed-volume", + "host-bind" + ], + "default": "managed-volume", + "managed_volume": { + "backup": true, + "default_size_gb": 8 + } + }, + { + "id": "volume-1", + "container_path": "/media", + "compose_source_example": "/path/to/video-library", + "read_only": true, + "required": false, + "installation_choice": [ + "host-bind", + "skip" + ], + "default": "skip", + "managed_volume": { + "backup": false, + "default_size_gb": 1 + } + } + ], + "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": "{\n \"name\": \"kroma\",\n \"services\": {\n \"kroma\": {\n \"image\": \"ghcr.io/kromatv/kroma:latest\",\n \"container_name\": \"kroma\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"4040:4040/tcp\"\n ],\n \"volumes\": [\n \"./data:/data\",\n \"/path/to/video-library:/media:ro\"\n ],\n \"environment\": {\n \"KROMA_MEDIA_DIRS\": \"/media\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "kroma", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "kroma", + "service_count": 1, + "services": [ + { + "name": "kroma", + "image": "ghcr.io/kromatv/kroma:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/kromatv/kroma:latest", + "container_name": "kroma", + "restart": "unless-stopped", + "ports": [ + "4040:4040/tcp" + ], + "volumes": [ + "./data:/data", + "/path/to/video-library:/media:ro" + ], + "environment": { + "KROMA_MEDIA_DIRS": "/media" + } + } + } + ], + "top_level": {}, + "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": "kroma-volume-0", + "service": "kroma", + "container_path": "/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "kroma" + ], + "stop_order": [ + "kroma" + ], + "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": "KROMA", + "scheme": "http", + "port": 4040, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/media", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 4040, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/apps/libre-closet.json b/oci/catalog/apps/libre-closet.json new file mode 100644 index 00000000..be917559 --- /dev/null +++ b/oci/catalog/apps/libre-closet.json @@ -0,0 +1,303 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-libre-closet", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Libre Closet" + }, + "description": { + "en_US": "Self-hosted wardrobe catalog for organizing clothing, outfits, and personal style with SQLite and local file storage." + }, + "category": "productivity", + "category_label": "Productivity & Workflows", + "author": "lazztech", + "developer": "lazztech", + "icon": "https://raw.githubusercontent.com/lazztech/Libre-Closet/main/public/favicon.ico", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 3000, + "path": "/" + }, + "website": "https://github.com/lazztech/Libre-Closet", + "documentation": "https://github.com/lazztech/Libre-Closet#readme", + "repository": "https://github.com/lazztech/Libre-Closet", + "tips": [ + "Upstream defaults to AUTH_ENABLED=false. Keep this service on a trusted network or enable authentication and configure accounts before exposing it beyond your LAN." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "lazztech", + "repository": "https://github.com/lazztech/Libre-Closet", + "default_branch": "main", + "revision": "08f66dd9fe071e3b62e529d0ca4050169d31532d", + "image_repository_url": "https://github.com/orgs/lazztech/packages/container/package/libre-closet", + "readme_pushed_at": "", + "compose_sha256": "55286f8ae33f8a4e91d9224ff1804e99b41fd9d5045409cbef3641be211c34c5", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/lazztech/Libre-Closet/main/README.md" + }, + "container_contract": { + "service_name": "libre-closet", + "container_name": "libre-closet", + "image": { + "reference": "ghcr.io/lazztech/libre-closet:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/lazztech/libre-closet", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "AUTH_ENABLED", + "example": "false", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "PWA_ENABLED", + "example": "true", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "DATA_PATH", + "example": "/app/data", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/app/data", + "compose_source_example": "./data", + "read_only": false, + "required": true, + "installation_choice": [ + "managed-volume", + "host-bind" + ], + "default": "managed-volume", + "managed_volume": { + "backup": true, + "default_size_gb": 8 + } + } + ], + "ports": [ + { + "container_port": 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": "{\n \"name\": \"libre-closet\",\n \"services\": {\n \"libre-closet\": {\n \"image\": \"ghcr.io/lazztech/libre-closet:latest\",\n \"container_name\": \"libre-closet\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"3000:3000/tcp\"\n ],\n \"volumes\": [\n \"./data:/app/data\"\n ],\n \"environment\": {\n \"AUTH_ENABLED\": \"false\",\n \"PWA_ENABLED\": \"true\",\n \"DATA_PATH\": \"/app/data\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "libre-closet", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "libre-closet", + "service_count": 1, + "services": [ + { + "name": "libre-closet", + "image": "ghcr.io/lazztech/libre-closet:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/lazztech/libre-closet:latest", + "container_name": "libre-closet", + "restart": "unless-stopped", + "ports": [ + "3000:3000/tcp" + ], + "volumes": [ + "./data:/app/data" + ], + "environment": { + "AUTH_ENABLED": "false", + "PWA_ENABLED": "true", + "DATA_PATH": "/app/data" + } + } + } + ], + "top_level": {}, + "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": "libre-closet-volume-0", + "service": "libre-closet", + "container_path": "/app/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "libre-closet" + ], + "stop_order": [ + "libre-closet" + ], + "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": "Libre Closet", + "scheme": "http", + "port": 3000, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [ + { + "container_path": "/app/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 3000, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/apps/lifttrace.json b/oci/catalog/apps/lifttrace.json new file mode 100644 index 00000000..3e506017 --- /dev/null +++ b/oci/catalog/apps/lifttrace.json @@ -0,0 +1,353 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-lifttrace", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "LiftTrace" + }, + "description": { + "en_US": "Self-hosted strength-training tracker with workout logs, programs, progress photos, and a mobile PWA." + }, + "category": "productivity", + "category_label": "Productivity & Workflows", + "author": "TraceApps", + "developer": "TraceApps", + "icon": "https://raw.githubusercontent.com/traceapps/lifttrace/main/public/icons/icon-512.png", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 3002, + "path": "/" + }, + "website": "https://github.com/traceapps/lifttrace", + "documentation": "https://github.com/traceapps/lifttrace#readme", + "repository": "https://github.com/traceapps/lifttrace", + "tips": [ + "The first-run wizard creates the initial administrator account." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "TraceApps", + "repository": "https://github.com/traceapps/lifttrace", + "default_branch": "main", + "revision": "bfde1fef9c8c38508197cd679ad646f3385ec5d8", + "image_repository_url": "https://github.com/orgs/traceapps/packages/container/package/lifttrace", + "readme_pushed_at": "", + "compose_sha256": "5e271146d220f3fda16a48b9e996f5a3df111461e36b4542fa91f245876af101", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/traceapps/lifttrace/main/README.md" + }, + "container_contract": { + "service_name": "lifttrace", + "container_name": "lifttrace", + "image": { + "reference": "ghcr.io/traceapps/lifttrace:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/traceapps/lifttrace", + "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": "upstream-documentation" + }, + { + "name": "DB_PATH", + "example": "/data/db/lifttrace.db", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "UPLOADS_PATH", + "example": "/data/uploads", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/data/db", + "compose_source_example": "./data/db", + "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/uploads", + "compose_source_example": "./data/uploads", + "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": 3002, + "published_example": 3002, + "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 \"name\": \"lifttrace\",\n \"services\": {\n \"lifttrace\": {\n \"image\": \"ghcr.io/traceapps/lifttrace:latest\",\n \"container_name\": \"lifttrace\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"3002:3002/tcp\"\n ],\n \"volumes\": [\n \"./data/db:/data/db\",\n \"./data/uploads:/data/uploads\"\n ],\n \"environment\": {\n \"JWT_SECRET\": \"${GENERATED_JWT_SECRET}\",\n \"DB_PATH\": \"/data/db/lifttrace.db\",\n \"UPLOADS_PATH\": \"/data/uploads\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "lifttrace", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "lifttrace", + "service_count": 1, + "services": [ + { + "name": "lifttrace", + "image": "ghcr.io/traceapps/lifttrace:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/traceapps/lifttrace:latest", + "container_name": "lifttrace", + "restart": "unless-stopped", + "ports": [ + "3002:3002/tcp" + ], + "volumes": [ + "./data/db:/data/db", + "./data/uploads:/data/uploads" + ], + "environment": { + "JWT_SECRET": "${GENERATED_JWT_SECRET}", + "DB_PATH": "/data/db/lifttrace.db", + "UPLOADS_PATH": "/data/uploads" + } + } + } + ], + "top_level": {}, + "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": "lifttrace-volume-0", + "service": "lifttrace", + "container_path": "/data/db", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + }, + { + "id": "lifttrace-volume-1", + "service": "lifttrace", + "container_path": "/data/uploads", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "lifttrace" + ], + "stop_order": [ + "lifttrace" + ], + "dependency_readiness": "compose-healthcheck-then-port-or-process-fallback", + "rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes" + }, + "installer_inputs": { + "prompted": [ + "stack_name", + "base_vmid", + "rootfs_storage", + "persistent_data_destinations", + "frontend_bridge", + "frontend_ipv4_mode" + ], + "automatic": [ + "dependent_vmids", + "private_bridge", + "private_subnet", + "private_service_addresses", + "compose_service_aliases", + "generated_secrets", + "dependency_start_and_stop_order" + ], + "generated_secrets": [ + { + "id": "generated-lifttrace-jwt-secret", + "strategy": "generate-cryptographically-random-at-install", + "bindings": [ + { + "service": "lifttrace", + "environment_variable": "JWT_SECRET" + } + ] + } + ] + } + }, + "first_run": { + "endpoints": [ + { + "label": "LiftTrace", + "scheme": "http", + "port": 3002, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": { + "JWT_SECRET": { + "strategy": "token-hex", + "bytes": 48 + } + }, + "volume_preparations": [ + { + "container_path": "/data/db", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data/uploads", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 3002, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/apps/maintainerr.json b/oci/catalog/apps/maintainerr.json new file mode 100644 index 00000000..4e9b146d --- /dev/null +++ b/oci/catalog/apps/maintainerr.json @@ -0,0 +1,288 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-maintainerr", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Maintainerr" + }, + "description": { + "en_US": "Self-hosted media-library cleanup and maintenance dashboard for Plex, Jellyfin, or Emby." + }, + "category": "media", + "category_label": "Media & Streaming", + "author": "Maintainerr", + "developer": "Maintainerr", + "icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/maintainerr.webp", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 6246, + "path": "/" + }, + "website": "https://github.com/Maintainerr/Maintainerr", + "documentation": "https://github.com/Maintainerr/Maintainerr#readme", + "repository": "https://github.com/Maintainerr/Maintainerr", + "tips": [ + "To manage a library, configure an external Plex, Jellyfin, or Emby server in the UI. CPU feature x86-64-v2 is required for overlays and collection-poster image processing; the UI can still start without it." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "Maintainerr", + "repository": "https://github.com/Maintainerr/Maintainerr", + "default_branch": "development", + "revision": "518078a712c8223b32e4d5817c8a90851c6c0743", + "image_repository_url": "https://github.com/orgs/Maintainerr/packages/container/package/maintainerr", + "readme_pushed_at": "", + "compose_sha256": "70d646e01856512988acdb119804c3ddb6c516d809c4b44c33806cefe42753e9", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/Maintainerr/Maintainerr/development/README.md" + }, + "container_contract": { + "service_name": "maintainerr", + "container_name": "maintainerr", + "image": { + "reference": "ghcr.io/maintainerr/maintainerr:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/maintainerr/maintainerr", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "TZ", + "example": "Europe/Madrid", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/opt/data", + "compose_source_example": "./data", + "read_only": false, + "required": true, + "installation_choice": [ + "managed-volume", + "host-bind" + ], + "default": "managed-volume", + "managed_volume": { + "backup": true, + "default_size_gb": 4 + } + } + ], + "ports": [ + { + "container_port": 6246, + "published_example": 6246, + "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 \"name\": \"maintainerr\",\n \"services\": {\n \"maintainerr\": {\n \"image\": \"ghcr.io/maintainerr/maintainerr:latest\",\n \"container_name\": \"maintainerr\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"6246:6246/tcp\"\n ],\n \"volumes\": [\n \"./data:/opt/data\"\n ],\n \"environment\": {\n \"TZ\": \"Europe/Madrid\"\n },\n \"user\": \"1000:1000\"\n }\n }\n}" + }, + "compose_stack": { + "project_name": "maintainerr", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "maintainerr", + "service_count": 1, + "services": [ + { + "name": "maintainerr", + "image": "ghcr.io/maintainerr/maintainerr:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/maintainerr/maintainerr:latest", + "container_name": "maintainerr", + "restart": "unless-stopped", + "ports": [ + "6246:6246/tcp" + ], + "volumes": [ + "./data:/opt/data" + ], + "environment": { + "TZ": "Europe/Madrid" + }, + "user": "1000:1000" + } + } + ], + "top_level": {}, + "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": "maintainerr-volume-0", + "service": "maintainerr", + "container_path": "/opt/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "maintainerr" + ], + "stop_order": [ + "maintainerr" + ], + "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": "Maintainerr", + "scheme": "http", + "port": 6246, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [ + { + "container_path": "/opt/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 6246, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/apps/notara.json b/oci/catalog/apps/notara.json new file mode 100644 index 00000000..db9b988b --- /dev/null +++ b/oci/catalog/apps/notara.json @@ -0,0 +1,303 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-notara", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Notara" + }, + "description": { + "en_US": "Self-hosted collaborative notes and knowledge base with pages, inline databases, and SQLite storage." + }, + "category": "documents", + "category_label": "Documents & Notes", + "author": "DnzzL", + "developer": "DnzzL", + "icon": "https://raw.githubusercontent.com/DnzzL/notara/main/packages/app/public/icon-512.svg", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 3000, + "path": "/" + }, + "website": "https://github.com/DnzzL/notara", + "documentation": "https://github.com/DnzzL/notara#readme", + "repository": "https://github.com/DnzzL/notara", + "tips": [ + "Create the initial account through the web interface. SMTP is optional and is needed only for invitations and password resets." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "DnzzL", + "repository": "https://github.com/DnzzL/notara", + "default_branch": "main", + "revision": "46dddd593651fe452ab0cc0951504d76d468e862", + "image_repository_url": "https://github.com/orgs/dnzzl/packages/container/package/notara", + "readme_pushed_at": "", + "compose_sha256": "7b74dd1c9a15ae341a165b646053c1fccccb948adc5b773134ccf04bd80ecb1a", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/DnzzL/notara/main/README.md" + }, + "container_contract": { + "service_name": "notara", + "container_name": "notara", + "image": { + "reference": "ghcr.io/dnzzl/notara:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/dnzzl/notara", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "BETTER_AUTH_SECRET", + "example": "${GENERATED_BETTER_AUTH_SECRET}", + "required": true, + "sensitive": true, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/data", + "compose_source_example": "./data", + "read_only": false, + "required": true, + "installation_choice": [ + "managed-volume", + "host-bind" + ], + "default": "managed-volume", + "managed_volume": { + "backup": true, + "default_size_gb": 8 + } + } + ], + "ports": [ + { + "container_port": 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": "{\n \"name\": \"notara\",\n \"services\": {\n \"notara\": {\n \"image\": \"ghcr.io/dnzzl/notara:latest\",\n \"container_name\": \"notara\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"3000:3000/tcp\"\n ],\n \"volumes\": [\n \"./data:/data\"\n ],\n \"environment\": {\n \"BETTER_AUTH_SECRET\": \"${GENERATED_BETTER_AUTH_SECRET}\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "notara", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "notara", + "service_count": 1, + "services": [ + { + "name": "notara", + "image": "ghcr.io/dnzzl/notara:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/dnzzl/notara:latest", + "container_name": "notara", + "restart": "unless-stopped", + "ports": [ + "3000:3000/tcp" + ], + "volumes": [ + "./data:/data" + ], + "environment": { + "BETTER_AUTH_SECRET": "${GENERATED_BETTER_AUTH_SECRET}" + } + } + } + ], + "top_level": {}, + "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": "notara-volume-0", + "service": "notara", + "container_path": "/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "notara" + ], + "stop_order": [ + "notara" + ], + "dependency_readiness": "compose-healthcheck-then-port-or-process-fallback", + "rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes" + }, + "installer_inputs": { + "prompted": [ + "stack_name", + "base_vmid", + "rootfs_storage", + "persistent_data_destinations", + "frontend_bridge", + "frontend_ipv4_mode" + ], + "automatic": [ + "dependent_vmids", + "private_bridge", + "private_subnet", + "private_service_addresses", + "compose_service_aliases", + "generated_secrets", + "dependency_start_and_stop_order" + ], + "generated_secrets": [ + { + "id": "generated-notara-better-auth-secret", + "strategy": "generate-cryptographically-random-at-install", + "bindings": [ + { + "service": "notara", + "environment_variable": "BETTER_AUTH_SECRET" + } + ] + } + ] + } + }, + "first_run": { + "endpoints": [ + { + "label": "Notara", + "scheme": "http", + "port": 3000, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": { + "BETTER_AUTH_SECRET": { + "strategy": "token-hex", + "bytes": 32 + } + }, + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 3000, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/apps/notetrace.json b/oci/catalog/apps/notetrace.json new file mode 100644 index 00000000..2e9008ef --- /dev/null +++ b/oci/catalog/apps/notetrace.json @@ -0,0 +1,353 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-notetrace", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "NoteTrace" + }, + "description": { + "en_US": "Self-hosted notes and notebooks with attachments, backups, and optional multi-user accounts." + }, + "category": "documents", + "category_label": "Documents & Notes", + "author": "TraceApps", + "developer": "TraceApps", + "icon": "https://raw.githubusercontent.com/traceapps/notetrace/main/public/icons/icon-512.png", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 3004, + "path": "/" + }, + "website": "https://github.com/traceapps/notetrace", + "documentation": "https://github.com/traceapps/notetrace#readme", + "repository": "https://github.com/traceapps/notetrace", + "tips": [ + "The first-run wizard creates the initial administrator account." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "TraceApps", + "repository": "https://github.com/traceapps/notetrace", + "default_branch": "main", + "revision": "0a3bf0b33531b940a069d98e1928f29d48894d6e", + "image_repository_url": "https://github.com/orgs/traceapps/packages/container/package/notetrace", + "readme_pushed_at": "", + "compose_sha256": "69d694f8c1e557f51dacd5a2427acc3d1ec47ce0207b70e518b18ca1ca7e6137", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/traceapps/notetrace/main/README.md" + }, + "container_contract": { + "service_name": "notetrace", + "container_name": "notetrace", + "image": { + "reference": "ghcr.io/traceapps/notetrace:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/traceapps/notetrace", + "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": "upstream-documentation" + }, + { + "name": "DB_PATH", + "example": "/data/db/notetrace.db", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "UPLOADS_PATH", + "example": "/data/uploads", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/data/db", + "compose_source_example": "./data/db", + "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/uploads", + "compose_source_example": "./data/uploads", + "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": 3004, + "published_example": 3004, + "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 \"name\": \"notetrace\",\n \"services\": {\n \"notetrace\": {\n \"image\": \"ghcr.io/traceapps/notetrace:latest\",\n \"container_name\": \"notetrace\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"3004:3004/tcp\"\n ],\n \"volumes\": [\n \"./data/db:/data/db\",\n \"./data/uploads:/data/uploads\"\n ],\n \"environment\": {\n \"JWT_SECRET\": \"${GENERATED_JWT_SECRET}\",\n \"DB_PATH\": \"/data/db/notetrace.db\",\n \"UPLOADS_PATH\": \"/data/uploads\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "notetrace", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "notetrace", + "service_count": 1, + "services": [ + { + "name": "notetrace", + "image": "ghcr.io/traceapps/notetrace:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/traceapps/notetrace:latest", + "container_name": "notetrace", + "restart": "unless-stopped", + "ports": [ + "3004:3004/tcp" + ], + "volumes": [ + "./data/db:/data/db", + "./data/uploads:/data/uploads" + ], + "environment": { + "JWT_SECRET": "${GENERATED_JWT_SECRET}", + "DB_PATH": "/data/db/notetrace.db", + "UPLOADS_PATH": "/data/uploads" + } + } + } + ], + "top_level": {}, + "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": "notetrace-volume-0", + "service": "notetrace", + "container_path": "/data/db", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + }, + { + "id": "notetrace-volume-1", + "service": "notetrace", + "container_path": "/data/uploads", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "notetrace" + ], + "stop_order": [ + "notetrace" + ], + "dependency_readiness": "compose-healthcheck-then-port-or-process-fallback", + "rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes" + }, + "installer_inputs": { + "prompted": [ + "stack_name", + "base_vmid", + "rootfs_storage", + "persistent_data_destinations", + "frontend_bridge", + "frontend_ipv4_mode" + ], + "automatic": [ + "dependent_vmids", + "private_bridge", + "private_subnet", + "private_service_addresses", + "compose_service_aliases", + "generated_secrets", + "dependency_start_and_stop_order" + ], + "generated_secrets": [ + { + "id": "generated-notetrace-jwt-secret", + "strategy": "generate-cryptographically-random-at-install", + "bindings": [ + { + "service": "notetrace", + "environment_variable": "JWT_SECRET" + } + ] + } + ] + } + }, + "first_run": { + "endpoints": [ + { + "label": "NoteTrace", + "scheme": "http", + "port": 3004, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": { + "JWT_SECRET": { + "strategy": "token-hex", + "bytes": 48 + } + }, + "volume_preparations": [ + { + "container_path": "/data/db", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data/uploads", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 3004, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/apps/nutritrace.json b/oci/catalog/apps/nutritrace.json new file mode 100644 index 00000000..f1511e35 --- /dev/null +++ b/oci/catalog/apps/nutritrace.json @@ -0,0 +1,353 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-nutritrace", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "NutriTrace" + }, + "description": { + "en_US": "Self-hosted nutrition and meal tracker with food logging, recipes, and nutrition data." + }, + "category": "productivity", + "category_label": "Productivity & Workflows", + "author": "TraceApps", + "developer": "TraceApps", + "icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/nutritrace.webp", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 3001, + "path": "/" + }, + "website": "https://github.com/traceapps/nutritrace", + "documentation": "https://github.com/traceapps/nutritrace#readme", + "repository": "https://github.com/traceapps/nutritrace", + "tips": [ + "The first-run wizard can enable user management and create an administrator; single-user mode is also available." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "TraceApps", + "repository": "https://github.com/traceapps/nutritrace", + "default_branch": "main", + "revision": "888c9664cd3a0222a9449cff506264097a2ae9b2", + "image_repository_url": "https://github.com/orgs/traceapps/packages/container/package/nutritrace", + "readme_pushed_at": "", + "compose_sha256": "2a9bbfd67502e5fd7e7d09393abd510b2ac70f9d841cd4cca44b5364e3348d90", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/traceapps/nutritrace/main/README.md" + }, + "container_contract": { + "service_name": "nutritrace", + "container_name": "nutritrace", + "image": { + "reference": "ghcr.io/traceapps/nutritrace:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/traceapps/nutritrace", + "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": "upstream-documentation" + }, + { + "name": "DB_PATH", + "example": "/data/db/nutritrace.db", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "UPLOADS_PATH", + "example": "/data/uploads", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/data/db", + "compose_source_example": "./data/db", + "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/uploads", + "compose_source_example": "./data/uploads", + "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": 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": "{\n \"name\": \"nutritrace\",\n \"services\": {\n \"nutritrace\": {\n \"image\": \"ghcr.io/traceapps/nutritrace:latest\",\n \"container_name\": \"nutritrace\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"3001:3001/tcp\"\n ],\n \"volumes\": [\n \"./data/db:/data/db\",\n \"./data/uploads:/data/uploads\"\n ],\n \"environment\": {\n \"JWT_SECRET\": \"${GENERATED_JWT_SECRET}\",\n \"DB_PATH\": \"/data/db/nutritrace.db\",\n \"UPLOADS_PATH\": \"/data/uploads\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "nutritrace", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "nutritrace", + "service_count": 1, + "services": [ + { + "name": "nutritrace", + "image": "ghcr.io/traceapps/nutritrace:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/traceapps/nutritrace:latest", + "container_name": "nutritrace", + "restart": "unless-stopped", + "ports": [ + "3001:3001/tcp" + ], + "volumes": [ + "./data/db:/data/db", + "./data/uploads:/data/uploads" + ], + "environment": { + "JWT_SECRET": "${GENERATED_JWT_SECRET}", + "DB_PATH": "/data/db/nutritrace.db", + "UPLOADS_PATH": "/data/uploads" + } + } + } + ], + "top_level": {}, + "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": "nutritrace-volume-0", + "service": "nutritrace", + "container_path": "/data/db", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + }, + { + "id": "nutritrace-volume-1", + "service": "nutritrace", + "container_path": "/data/uploads", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "nutritrace" + ], + "stop_order": [ + "nutritrace" + ], + "dependency_readiness": "compose-healthcheck-then-port-or-process-fallback", + "rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes" + }, + "installer_inputs": { + "prompted": [ + "stack_name", + "base_vmid", + "rootfs_storage", + "persistent_data_destinations", + "frontend_bridge", + "frontend_ipv4_mode" + ], + "automatic": [ + "dependent_vmids", + "private_bridge", + "private_subnet", + "private_service_addresses", + "compose_service_aliases", + "generated_secrets", + "dependency_start_and_stop_order" + ], + "generated_secrets": [ + { + "id": "generated-nutritrace-jwt-secret", + "strategy": "generate-cryptographically-random-at-install", + "bindings": [ + { + "service": "nutritrace", + "environment_variable": "JWT_SECRET" + } + ] + } + ] + } + }, + "first_run": { + "endpoints": [ + { + "label": "NutriTrace", + "scheme": "http", + "port": 3001, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": { + "JWT_SECRET": { + "strategy": "token-hex", + "bytes": 48 + } + }, + "volume_preparations": [ + { + "container_path": "/data/db", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data/uploads", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 3001, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/apps/opengist.json b/oci/catalog/apps/opengist.json new file mode 100644 index 00000000..a12aa18e --- /dev/null +++ b/oci/catalog/apps/opengist.json @@ -0,0 +1,285 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-opengist", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Opengist" + }, + "description": { + "en_US": "Self-hosted Git-powered pastebin for snippets with syntax highlighting, history, and optional Git-over-SSH access." + }, + "category": "documents", + "category_label": "Documents & Notes", + "author": "thomiceli", + "developer": "thomiceli", + "icon": "https://raw.githubusercontent.com/thomiceli/opengist/master/public/img/opengist.svg", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 6157, + "path": "/" + }, + "website": "https://opengist.io/", + "documentation": "https://opengist.io/docs", + "repository": "https://github.com/thomiceli/opengist", + "tips": [ + "The /opengist directory contains the SQLite database and Git-backed snippets.", + "Port 2222 provides Git-over-SSH; publish it only if you plan to use that feature." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "thomiceli", + "repository": "https://github.com/thomiceli/opengist", + "default_branch": "master", + "revision": "2acf3dae87f9c3d536e0a870787941bbd06d0b46", + "image_repository_url": "https://github.com/thomiceli/opengist/pkgs/container/opengist", + "readme_pushed_at": "", + "compose_sha256": "493ca309582a2dd17a31e7a7b12835830e7ee0b75c4faf20c21bfd9419a0ad30", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/thomiceli/opengist/master/README.md" + }, + "container_contract": { + "service_name": "opengist", + "container_name": "opengist", + "image": { + "reference": "ghcr.io/thomiceli/opengist:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/thomiceli/opengist", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [], + "volumes": [ + { + "id": "volume-0", + "container_path": "/opengist", + "compose_source_example": "./opengist-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": 6157, + "published_example": 6157, + "protocol": "tcp", + "required": true, + "proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat" + }, + { + "container_port": 2222, + "published_example": 2222, + "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 \"name\": \"opengist\",\n \"services\": {\n \"opengist\": {\n \"image\": \"ghcr.io/thomiceli/opengist:latest\",\n \"container_name\": \"opengist\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"6157:6157/tcp\",\n \"2222:2222/tcp\"\n ],\n \"volumes\": [\n \"./opengist-data:/opengist\"\n ]\n }\n }\n}" + }, + "compose_stack": { + "project_name": "opengist", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "opengist", + "service_count": 1, + "services": [ + { + "name": "opengist", + "image": "ghcr.io/thomiceli/opengist:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/thomiceli/opengist:latest", + "container_name": "opengist", + "restart": "unless-stopped", + "ports": [ + "6157:6157/tcp", + "2222:2222/tcp" + ], + "volumes": [ + "./opengist-data:/opengist" + ] + } + } + ], + "top_level": {}, + "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": "opengist-volume-0", + "service": "opengist", + "container_path": "/opengist", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "opengist" + ], + "stop_order": [ + "opengist" + ], + "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": "Opengist", + "scheme": "http", + "port": 6157, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [ + { + "container_path": "/opengist", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 6157, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/apps/opentask.json b/oci/catalog/apps/opentask.json new file mode 100644 index 00000000..b5cb0d93 --- /dev/null +++ b/oci/catalog/apps/opentask.json @@ -0,0 +1,276 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-opentask", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "OpenTask" + }, + "description": { + "en_US": "Self-hosted personal task manager with a Todoist-compatible workflow, search, and automatic account-registration lock." + }, + "category": "productivity", + "category_label": "Productivity & Workflows", + "author": "pranav-karra-3301", + "developer": "pranav-karra-3301", + "icon": "https://raw.githubusercontent.com/junkdrawerlab/opentask/main/assets/brand/icon.svg", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 7968, + "path": "/" + }, + "website": "https://github.com/junkdrawerlab/opentask", + "documentation": "https://github.com/junkdrawerlab/opentask#readme", + "repository": "https://github.com/pranav-karra-3301/opentask", + "tips": [ + "The first user registration is automatically treated as the administrator and locks new registration; HTTPS is needed for Web Push outside localhost." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "pranav-karra-3301", + "repository": "https://github.com/pranav-karra-3301/opentask", + "default_branch": "main", + "revision": "1214ee494d9692c39a733933a10ddc66af6a580f", + "image_repository_url": "https://github.com/orgs/pranav-karra-3301/packages/container/package/opentask", + "readme_pushed_at": "", + "compose_sha256": "f0f5b59f015c866295b7027420951dd8df66abb7296e0ccef47fdbd9bbeb7b09", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/pranav-karra-3301/opentask/main/README.md" + }, + "container_contract": { + "service_name": "opentask", + "container_name": "opentask", + "image": { + "reference": "ghcr.io/pranav-karra-3301/opentask:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/pranav-karra-3301/opentask", + "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", + "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": 7968, + "published_example": 7968, + "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 \"name\": \"opentask\",\n \"services\": {\n \"opentask\": {\n \"image\": \"ghcr.io/pranav-karra-3301/opentask:latest\",\n \"container_name\": \"opentask\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"7968:7968/tcp\"\n ],\n \"volumes\": [\n \"./data:/data\"\n ]\n }\n }\n}" + }, + "compose_stack": { + "project_name": "opentask", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "opentask", + "service_count": 1, + "services": [ + { + "name": "opentask", + "image": "ghcr.io/pranav-karra-3301/opentask:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/pranav-karra-3301/opentask:latest", + "container_name": "opentask", + "restart": "unless-stopped", + "ports": [ + "7968:7968/tcp" + ], + "volumes": [ + "./data:/data" + ] + } + } + ], + "top_level": {}, + "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": "opentask-volume-0", + "service": "opentask", + "container_path": "/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "opentask" + ], + "stop_order": [ + "opentask" + ], + "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": "OpenTask", + "scheme": "http", + "port": 7968, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 7968, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/apps/papra.json b/oci/catalog/apps/papra.json new file mode 100644 index 00000000..31e9a886 --- /dev/null +++ b/oci/catalog/apps/papra.json @@ -0,0 +1,302 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-papra", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Papra" + }, + "description": { + "en_US": "Self-hosted document management for storing, organizing, searching, and sharing personal documents." + }, + "category": "documents", + "category_label": "Documents & Notes", + "author": "papra-hq", + "developer": "papra-hq", + "icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/papra.webp", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 1221, + "path": "/" + }, + "website": "https://papra.app/", + "documentation": "https://docs.papra.app/self-hosting/using-docker/", + "repository": "https://github.com/papra-hq/papra", + "tips": [ + "The installer generates AUTH_SECRET. Keep /app/app-data backed up; it contains the database and documents." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "papra-hq", + "repository": "https://github.com/papra-hq/papra", + "default_branch": "main", + "revision": "93a569f3e90fd63a6034522d6c3b316d8bb67a65", + "image_repository_url": "https://github.com/orgs/papra-hq/packages/container/package/papra", + "readme_pushed_at": "", + "compose_sha256": "49e2b3120cd8d33b5d737a872bd2f695fb1bea63f155f9142ccc7860e93ede2e", + "generated_at": "2026-10-26T06:10:04+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/papra-hq/papra/main/README.md" + }, + "container_contract": { + "service_name": "papra", + "container_name": "papra", + "image": { + "reference": "ghcr.io/papra-hq/papra:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/papra-hq/papra", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "AUTH_SECRET", + "example": "${GENERATED_AUTH_SECRET}", + "required": true, + "sensitive": true, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/app/app-data", + "compose_source_example": "./papra-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": 1221, + "published_example": 1221, + "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 \"name\": \"papra\",\n \"services\": {\n \"papra\": {\n \"image\": \"ghcr.io/papra-hq/papra:latest\",\n \"container_name\": \"papra\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"1221:1221/tcp\"\n ],\n \"volumes\": [\n \"./papra-data:/app/app-data\"\n ],\n \"environment\": {\n \"AUTH_SECRET\": \"${GENERATED_AUTH_SECRET}\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "papra", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "papra", + "service_count": 1, + "services": [ + { + "name": "papra", + "image": "ghcr.io/papra-hq/papra:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/papra-hq/papra:latest", + "container_name": "papra", + "restart": "unless-stopped", + "ports": [ + "1221:1221/tcp" + ], + "volumes": [ + "./papra-data:/app/app-data" + ], + "environment": { + "AUTH_SECRET": "${GENERATED_AUTH_SECRET}" + } + } + } + ], + "top_level": {}, + "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": "papra-volume-0", + "service": "papra", + "container_path": "/app/app-data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "papra" + ], + "stop_order": [ + "papra" + ], + "dependency_readiness": "compose-healthcheck-then-port-or-process-fallback", + "rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes" + }, + "installer_inputs": { + "prompted": [ + "stack_name", + "base_vmid", + "rootfs_storage", + "persistent_data_destinations", + "frontend_bridge", + "frontend_ipv4_mode" + ], + "automatic": [ + "dependent_vmids", + "private_bridge", + "private_subnet", + "private_service_addresses", + "compose_service_aliases", + "generated_secrets", + "dependency_start_and_stop_order" + ], + "generated_secrets": [ + { + "id": "generated-papra-auth-secret", + "strategy": "generate-cryptographically-random-at-install", + "bindings": [ + { + "service": "papra", + "environment_variable": "AUTH_SECRET" + } + ] + } + ] + } + }, + "first_run": { + "endpoints": [ + { + "label": "Papra", + "scheme": "http", + "port": 1221, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": { + "AUTH_SECRET": { + "strategy": "token-hex", + "bytes": 48 + } + }, + "volume_preparations": [ + { + "container_path": "/app/app-data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 1221, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/apps/photofield.json b/oci/catalog/apps/photofield.json new file mode 100644 index 00000000..518c168d --- /dev/null +++ b/oci/catalog/apps/photofield.json @@ -0,0 +1,298 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-photofield", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Photofield" + }, + "description": { + "en_US": "Self-hosted photo library that indexes local photo collections and keeps its thumbnail cache in persistent storage." + }, + "category": "media", + "category_label": "Media & Streaming", + "author": "SmilyOrg", + "developer": "SmilyOrg", + "icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/photofield.webp", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 8080, + "path": "/" + }, + "website": "https://github.com/SmilyOrg/photofield", + "documentation": "https://github.com/SmilyOrg/photofield#readme", + "repository": "https://github.com/SmilyOrg/photofield", + "tips": [ + "Map a host photo directory at /app/photos for a real library; it is mounted read-only in the upstream example." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "SmilyOrg", + "repository": "https://github.com/SmilyOrg/photofield", + "default_branch": "main", + "revision": "d7374a9ab11be7d684e958b9bdf2b4205d0dbc23", + "image_repository_url": "https://github.com/orgs/SmilyOrg/packages/container/package/photofield", + "readme_pushed_at": "", + "compose_sha256": "9786bbfa8603a75fa42037397f14707c6f2d830edb2bc9844474590764ee5de4", + "generated_at": "2026-10-26T06:10:04+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/SmilyOrg/photofield/main/README.md" + }, + "container_contract": { + "service_name": "photofield", + "container_name": "photofield", + "image": { + "reference": "ghcr.io/smilyorg/photofield:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/smilyorg/photofield", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [], + "volumes": [ + { + "id": "volume-0", + "container_path": "/app/data", + "compose_source_example": "./data", + "read_only": false, + "required": true, + "installation_choice": [ + "managed-volume", + "host-bind" + ], + "default": "managed-volume", + "managed_volume": { + "backup": true, + "default_size_gb": 8 + } + }, + { + "id": "volume-1", + "container_path": "/app/photos", + "compose_source_example": "./photos", + "read_only": true, + "required": false, + "installation_choice": [ + "host-bind", + "skip" + ], + "default": "skip", + "managed_volume": { + "backup": false, + "default_size_gb": 1 + } + } + ], + "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": "{\n \"name\": \"photofield\",\n \"services\": {\n \"photofield\": {\n \"image\": \"ghcr.io/smilyorg/photofield:latest\",\n \"container_name\": \"photofield\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"8080:8080/tcp\"\n ],\n \"volumes\": [\n \"./data:/app/data\",\n \"./photos:/app/photos:ro\"\n ]\n }\n }\n}" + }, + "compose_stack": { + "project_name": "photofield", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "photofield", + "service_count": 1, + "services": [ + { + "name": "photofield", + "image": "ghcr.io/smilyorg/photofield:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/smilyorg/photofield:latest", + "container_name": "photofield", + "restart": "unless-stopped", + "ports": [ + "8080:8080/tcp" + ], + "volumes": [ + "./data:/app/data", + "./photos:/app/photos:ro" + ] + } + } + ], + "top_level": {}, + "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": "photofield-volume-0", + "service": "photofield", + "container_path": "/app/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "photofield" + ], + "stop_order": [ + "photofield" + ], + "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": "Photofield", + "scheme": "http", + "port": 8080, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [ + { + "container_path": "/app/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/app/photos", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 8080, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/apps/plants.json b/oci/catalog/apps/plants.json new file mode 100644 index 00000000..f5668d72 --- /dev/null +++ b/oci/catalog/apps/plants.json @@ -0,0 +1,285 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-plants", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Plants" + }, + "description": { + "en_US": "Self-hosted household plant-care tracker with reminders, photos, and multiple user accounts." + }, + "category": "productivity", + "category_label": "Productivity & Workflows", + "author": "dhrandy", + "developer": "dhrandy", + "icon": "https://raw.githubusercontent.com/dhrandy/plants/main/app/static/icon.svg", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64" + ], + "launch": { + "scheme": "http", + "port": 8000, + "path": "/" + }, + "website": "https://github.com/dhrandy/plants", + "documentation": "https://github.com/dhrandy/plants#readme", + "repository": "https://github.com/dhrandy/plants", + "tips": [ + "The first visit opens setup; the first account becomes the administrator." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "dhrandy", + "repository": "https://github.com/dhrandy/plants", + "default_branch": "main", + "revision": "e40a84a0fb9c1e9de491f9f69653034e561ac7fe", + "image_repository_url": "https://github.com/orgs/dhrandy/packages/container/package/plants", + "readme_pushed_at": "", + "compose_sha256": "25e903044cb5ef53f0b58ec9cab4ce88d47c4073bf69f8c6c836389cae46cd87", + "generated_at": "2026-10-26T06:10:04+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/dhrandy/plants/main/README.md" + }, + "container_contract": { + "service_name": "plants", + "container_name": "plants", + "image": { + "reference": "ghcr.io/dhrandy/plants:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/dhrandy/plants", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "TZ", + "example": "UTC", + "required": false, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/app/data", + "compose_source_example": "./data", + "read_only": false, + "required": true, + "installation_choice": [ + "managed-volume", + "host-bind" + ], + "default": "managed-volume", + "managed_volume": { + "backup": true, + "default_size_gb": 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": "{\n \"name\": \"plants\",\n \"services\": {\n \"plants\": {\n \"image\": \"ghcr.io/dhrandy/plants:latest\",\n \"container_name\": \"plants\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"8000:8000/tcp\"\n ],\n \"volumes\": [\n \"./data:/app/data\"\n ],\n \"environment\": {\n \"TZ\": \"UTC\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "plants", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "plants", + "service_count": 1, + "services": [ + { + "name": "plants", + "image": "ghcr.io/dhrandy/plants:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/dhrandy/plants:latest", + "container_name": "plants", + "restart": "unless-stopped", + "ports": [ + "8000:8000/tcp" + ], + "volumes": [ + "./data:/app/data" + ], + "environment": { + "TZ": "UTC" + } + } + } + ], + "top_level": {}, + "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": "plants-volume-0", + "service": "plants", + "container_path": "/app/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "plants" + ], + "stop_order": [ + "plants" + ], + "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": "Plants", + "scheme": "http", + "port": 8000, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [ + { + "container_path": "/app/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 8000, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/apps/sofa.json b/oci/catalog/apps/sofa.json new file mode 100644 index 00000000..b5c410a5 --- /dev/null +++ b/oci/catalog/apps/sofa.json @@ -0,0 +1,321 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-sofa", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Sofa" + }, + "description": { + "en_US": "Self-hosted movie and TV tracker with watch history, recommendations, and media-server integrations." + }, + "category": "media", + "category_label": "Media & Streaming", + "author": "jakejarvis", + "developer": "jakejarvis", + "icon": "https://raw.githubusercontent.com/jakejarvis/sofa/main/apps/web/public/icon.svg", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 3000, + "path": "/" + }, + "website": "https://github.com/jakejarvis/sofa", + "documentation": "https://github.com/jakejarvis/sofa#readme", + "repository": "https://github.com/jakejarvis/sofa", + "tips": [ + "A TMDB API Read Access Token is required for metadata and discovery. Update BETTER_AUTH_URL to the public HTTPS address when putting the app behind a reverse proxy.", + "The first account created becomes the administrator and registration then closes by default." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "jakejarvis", + "repository": "https://github.com/jakejarvis/sofa", + "default_branch": "main", + "revision": "a8294d977b0f2c0ad267d0b516298881a5571e86", + "image_repository_url": "https://github.com/orgs/jakejarvis/packages/container/package/sofa", + "readme_pushed_at": "", + "compose_sha256": "f58035702e2110cf26805bcb3c6a442296146ddd8dd36c1bf956469e94007471", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/jakejarvis/sofa/main/README.md" + }, + "container_contract": { + "service_name": "sofa", + "container_name": "sofa", + "image": { + "reference": "ghcr.io/jakejarvis/sofa:edge", + "registry": "ghcr.io", + "repository": "ghcr.io/jakejarvis/sofa", + "tag": "edge", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "TMDB_API_READ_ACCESS_TOKEN", + "example": null, + "required": true, + "sensitive": true, + "source": "upstream-documentation" + }, + { + "name": "BETTER_AUTH_SECRET", + "example": "${GENERATED_BETTER_AUTH_SECRET}", + "required": true, + "sensitive": true, + "source": "upstream-documentation" + }, + { + "name": "BETTER_AUTH_URL", + "example": "http://@CONTAINER_ADDRESS@:3000", + "required": true, + "sensitive": false, + "container_address": "http://@CONTAINER_ADDRESS@:3000", + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/data", + "compose_source_example": "./data", + "read_only": false, + "required": true, + "installation_choice": [ + "managed-volume", + "host-bind" + ], + "default": "managed-volume", + "managed_volume": { + "backup": true, + "default_size_gb": 8 + } + } + ], + "ports": [ + { + "container_port": 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": "{\n \"name\": \"sofa\",\n \"services\": {\n \"sofa\": {\n \"image\": \"ghcr.io/jakejarvis/sofa:edge\",\n \"container_name\": \"sofa\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"3000:3000/tcp\"\n ],\n \"volumes\": [\n \"./data:/data\"\n ],\n \"environment\": {\n \"TMDB_API_READ_ACCESS_TOKEN\": null,\n \"BETTER_AUTH_SECRET\": \"${GENERATED_BETTER_AUTH_SECRET}\",\n \"BETTER_AUTH_URL\": \"http://@CONTAINER_ADDRESS@:3000\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "sofa", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "sofa", + "service_count": 1, + "services": [ + { + "name": "sofa", + "image": "ghcr.io/jakejarvis/sofa:edge", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/jakejarvis/sofa:edge", + "container_name": "sofa", + "restart": "unless-stopped", + "ports": [ + "3000:3000/tcp" + ], + "volumes": [ + "./data:/data" + ], + "environment": { + "TMDB_API_READ_ACCESS_TOKEN": null, + "BETTER_AUTH_SECRET": "${GENERATED_BETTER_AUTH_SECRET}", + "BETTER_AUTH_URL": "http://@CONTAINER_ADDRESS@:3000" + } + } + } + ], + "top_level": {}, + "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": "sofa-volume-0", + "service": "sofa", + "container_path": "/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "sofa" + ], + "stop_order": [ + "sofa" + ], + "dependency_readiness": "compose-healthcheck-then-port-or-process-fallback", + "rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes" + }, + "installer_inputs": { + "prompted": [ + "stack_name", + "base_vmid", + "rootfs_storage", + "persistent_data_destinations", + "frontend_bridge", + "frontend_ipv4_mode" + ], + "automatic": [ + "dependent_vmids", + "private_bridge", + "private_subnet", + "private_service_addresses", + "compose_service_aliases", + "generated_secrets", + "dependency_start_and_stop_order" + ], + "generated_secrets": [ + { + "id": "generated-sofa-better-auth-secret", + "strategy": "generate-cryptographically-random-at-install", + "bindings": [ + { + "service": "sofa", + "environment_variable": "BETTER_AUTH_SECRET" + } + ] + } + ] + } + }, + "first_run": { + "endpoints": [ + { + "label": "Sofa", + "scheme": "http", + "port": 3000, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": { + "BETTER_AUTH_SECRET": { + "strategy": "token-hex", + "bytes": 32 + } + }, + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 3000, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/apps/web-check.json b/oci/catalog/apps/web-check.json new file mode 100644 index 00000000..2db02d7b --- /dev/null +++ b/oci/catalog/apps/web-check.json @@ -0,0 +1,238 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-web-check", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Web Check" + }, + "description": { + "en_US": "Self-hosted website diagnostics for checking DNS, TLS certificates, HTTP headers, and other web properties." + }, + "category": "tools", + "category_label": "Tools", + "author": "Lissy93", + "developer": "Lissy93", + "icon": "https://raw.githubusercontent.com/Lissy93/web-check/master/public/favicon.svg", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 3000, + "path": "/" + }, + "website": "https://web-check.xyz/", + "documentation": "https://github.com/Lissy93/web-check#readme", + "repository": "https://github.com/Lissy93/web-check", + "tips": [ + "No authentication is built in. Restrict access to trusted users and avoid exposing the service publicly; submitted checks can target private network addresses." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "Lissy93", + "repository": "https://github.com/Lissy93/web-check", + "default_branch": "master", + "revision": "d4be4895c94270c3b8d5a2be544298e3b1b7ee39", + "image_repository_url": "https://github.com/orgs/Lissy93/packages/container/package/web-check", + "readme_pushed_at": "", + "compose_sha256": "273607094e2cec1c15d64d9a672c89aa033ad109acf1580c47f4fa52ca3ea019", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/Lissy93/web-check/master/README.md" + }, + "container_contract": { + "service_name": "web-check", + "container_name": "web-check", + "image": { + "reference": "ghcr.io/lissy93/web-check:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/lissy93/web-check", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [], + "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": "{\n \"name\": \"web-check\",\n \"services\": {\n \"web-check\": {\n \"image\": \"ghcr.io/lissy93/web-check:latest\",\n \"container_name\": \"web-check\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"3000:3000/tcp\"\n ],\n \"volumes\": []\n }\n }\n}" + }, + "compose_stack": { + "project_name": "web-check", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "web-check", + "service_count": 1, + "services": [ + { + "name": "web-check", + "image": "ghcr.io/lissy93/web-check:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/lissy93/web-check:latest", + "container_name": "web-check", + "restart": "unless-stopped", + "ports": [ + "3000:3000/tcp" + ], + "volumes": [] + } + } + ], + "top_level": {}, + "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": [ + "web-check" + ], + "stop_order": [ + "web-check" + ], + "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 Check", + "scheme": "http", + "port": 3000, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [], + "startup_healthcheck": { + "scheme": "http", + "port": 3000, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/curated/artalk.json b/oci/catalog/curated/artalk.json new file mode 100644 index 00000000..d48110aa --- /dev/null +++ b/oci/catalog/curated/artalk.json @@ -0,0 +1,276 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-artalk", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Artalk" + }, + "description": { + "en_US": "Self-hosted comment server for blogs and websites, with a browser-based dashboard." + }, + "category": "documents", + "category_label": "Documents & Notes", + "author": "ArtalkJS", + "developer": "ArtalkJS", + "icon": "https://raw.githubusercontent.com/ArtalkJS/Artalk/master/docs/docs/images/artalk-logo.png", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 23366, + "path": "/" + }, + "website": "https://artalk.js.org/", + "documentation": "https://artalk.js.org/en/guide/deploy.html", + "repository": "https://github.com/ArtalkJS/Artalk", + "tips": [ + "Create the initial dashboard administrator from the container console with the upstream artalk admin command." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "ArtalkJS", + "repository": "https://github.com/ArtalkJS/Artalk", + "default_branch": "master", + "revision": "53d15ee0c3a908b4a58fc43f42c44b5e709279bd", + "image_repository_url": "https://hub.docker.com/r/artalk/artalk-go", + "readme_pushed_at": "", + "compose_sha256": "856f4fcf59914076799bc5774d1e69ab3d3da7d60c3b2598062864cd02552677", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/ArtalkJS/Artalk/master/README.md" + }, + "container_contract": { + "service_name": "artalk", + "container_name": "artalk", + "image": { + "reference": "docker.io/artalk/artalk-go:latest", + "registry": "docker.io", + "repository": "docker.io/artalk/artalk-go", + "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", + "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": 23366, + "published_example": 23366, + "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 \"name\": \"artalk\",\n \"services\": {\n \"artalk\": {\n \"image\": \"docker.io/artalk/artalk-go:latest\",\n \"container_name\": \"artalk\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"23366:23366/tcp\"\n ],\n \"volumes\": [\n \"./data:/data\"\n ]\n }\n }\n}" + }, + "compose_stack": { + "project_name": "artalk", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "artalk", + "service_count": 1, + "services": [ + { + "name": "artalk", + "image": "docker.io/artalk/artalk-go:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "docker.io/artalk/artalk-go:latest", + "container_name": "artalk", + "restart": "unless-stopped", + "ports": [ + "23366:23366/tcp" + ], + "volumes": [ + "./data:/data" + ] + } + } + ], + "top_level": {}, + "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": "artalk-volume-0", + "service": "artalk", + "container_path": "/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "artalk" + ], + "stop_order": [ + "artalk" + ], + "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": "Artalk", + "scheme": "http", + "port": 23366, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 23366, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/curated/bichon.json b/oci/catalog/curated/bichon.json new file mode 100644 index 00000000..1ac110fd --- /dev/null +++ b/oci/catalog/curated/bichon.json @@ -0,0 +1,313 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-bichon", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Bichon" + }, + "description": { + "en_US": "Self-hosted email archival and search server that downloads mailboxes over IMAP into encrypted local storage." + }, + "category": "communication", + "category_label": "Communication & Community", + "author": "rustmailer", + "developer": "rustmailer", + "icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/bichon.webp", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 15630, + "path": "/" + }, + "website": "https://github.com/rustmailer/bichon", + "documentation": "https://github.com/rustmailer/bichon#readme", + "repository": "https://github.com/rustmailer/bichon", + "tips": [ + "The upstream Docker command runs as UID:GID 1000:1000 and requires BICHON_ENCRYPT_PASSWORD. The initial web login is admin / admin@bichon; change it immediately." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "rustmailer", + "repository": "https://github.com/rustmailer/bichon", + "default_branch": "main", + "revision": "010e7dbd8ea1eceb478d6cee070c2156319e5685", + "image_repository_url": "https://hub.docker.com/r/rustmailer/bichon", + "readme_pushed_at": "", + "compose_sha256": "8e6b0d98f8fe7ff90ec4d092fc19ece93ba1f940b6690914c9fd6ab864729cdd", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/rustmailer/bichon/main/README.md" + }, + "container_contract": { + "service_name": "bichon", + "container_name": "bichon", + "image": { + "reference": "docker.io/rustmailer/bichon:latest", + "registry": "docker.io", + "repository": "docker.io/rustmailer/bichon", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "BICHON_ROOT_DIR", + "example": "/data", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "BICHON_ENCRYPT_PASSWORD", + "example": null, + "required": true, + "sensitive": true, + "source": "upstream-documentation" + }, + { + "name": "BICHON_LOG_LEVEL", + "example": "info", + "required": false, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/data", + "compose_source_example": "./bichon-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": 15630, + "published_example": 15630, + "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 \"name\": \"bichon\",\n \"services\": {\n \"bichon\": {\n \"image\": \"docker.io/rustmailer/bichon:latest\",\n \"container_name\": \"bichon\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"15630:15630/tcp\"\n ],\n \"volumes\": [\n \"./bichon-data:/data\"\n ],\n \"environment\": {\n \"BICHON_ROOT_DIR\": \"/data\",\n \"BICHON_ENCRYPT_PASSWORD\": null,\n \"BICHON_LOG_LEVEL\": \"info\"\n },\n \"user\": \"1000:1000\"\n }\n }\n}" + }, + "compose_stack": { + "project_name": "bichon", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "bichon", + "service_count": 1, + "services": [ + { + "name": "bichon", + "image": "docker.io/rustmailer/bichon:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "docker.io/rustmailer/bichon:latest", + "container_name": "bichon", + "restart": "unless-stopped", + "ports": [ + "15630:15630/tcp" + ], + "volumes": [ + "./bichon-data:/data" + ], + "environment": { + "BICHON_ROOT_DIR": "/data", + "BICHON_ENCRYPT_PASSWORD": null, + "BICHON_LOG_LEVEL": "info" + }, + "user": "1000:1000" + } + } + ], + "top_level": {}, + "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": "bichon-volume-0", + "service": "bichon", + "container_path": "/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "bichon" + ], + "stop_order": [ + "bichon" + ], + "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": "Bichon", + "scheme": "http", + "port": 15630, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [ + { + "label": "Bichon administrator", + "type": "static-default", + "username": "admin", + "password": "admin@bichon", + "change_required": true, + "source": "upstream-documentation" + } + ] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 15630, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/curated/calnode.json b/oci/catalog/curated/calnode.json new file mode 100644 index 00000000..dd723152 --- /dev/null +++ b/oci/catalog/curated/calnode.json @@ -0,0 +1,333 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-calnode", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Calnode" + }, + "description": { + "en_US": "Self-hosted scheduling and booking app with a built-in admin interface and SQLite database." + }, + "category": "productivity", + "category_label": "Productivity & Workflows", + "author": "Calnode", + "developer": "Calnode", + "icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/calnode.webp", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 3000, + "path": "/admin/" + }, + "website": "https://github.com/Calnode/calnode", + "documentation": "https://github.com/Calnode/calnode/blob/main/DEPLOY.md", + "repository": "https://github.com/Calnode/calnode", + "tips": [ + "The generated encryption and recovery secrets must be backed up with /data; losing them may make stored credentials unrecoverable. Configure HTTPS before enabling integrations that require secure origins." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "Calnode", + "repository": "https://github.com/Calnode/calnode", + "default_branch": "main", + "revision": "e0a942f8a7234c1dd28e1688ae35d3d6ec9f169f", + "image_repository_url": "https://github.com/orgs/calnode/packages/container/package/calnode", + "readme_pushed_at": "", + "compose_sha256": "719e5706269e843f00e5036390e9179253f64c472318cd5d960173cfb6dc03a8", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/Calnode/calnode/main/README.md" + }, + "container_contract": { + "service_name": "calnode", + "container_name": "calnode", + "image": { + "reference": "ghcr.io/calnode/calnode:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/calnode/calnode", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "CALNODE_ENCRYPTION_KEY", + "example": "${GENERATED_CALNODE_ENCRYPTION_KEY}", + "required": true, + "sensitive": true, + "source": "upstream-documentation" + }, + { + "name": "CALNODE_RECOVERY_SECRET", + "example": "${GENERATED_CALNODE_RECOVERY_SECRET}", + "required": true, + "sensitive": true, + "source": "upstream-documentation" + }, + { + "name": "DATABASE_URL", + "example": "sqlite:///data/calnode.db", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/data", + "compose_source_example": "./data", + "read_only": false, + "required": true, + "installation_choice": [ + "managed-volume", + "host-bind" + ], + "default": "managed-volume", + "managed_volume": { + "backup": true, + "default_size_gb": 8 + } + } + ], + "ports": [ + { + "container_port": 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": "{\n \"name\": \"calnode\",\n \"services\": {\n \"calnode\": {\n \"image\": \"ghcr.io/calnode/calnode:latest\",\n \"container_name\": \"calnode\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"3000:3000/tcp\"\n ],\n \"volumes\": [\n \"./data:/data\"\n ],\n \"environment\": {\n \"CALNODE_ENCRYPTION_KEY\": \"${GENERATED_CALNODE_ENCRYPTION_KEY}\",\n \"CALNODE_RECOVERY_SECRET\": \"${GENERATED_CALNODE_RECOVERY_SECRET}\",\n \"DATABASE_URL\": \"sqlite:///data/calnode.db\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "calnode", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "calnode", + "service_count": 1, + "services": [ + { + "name": "calnode", + "image": "ghcr.io/calnode/calnode:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/calnode/calnode:latest", + "container_name": "calnode", + "restart": "unless-stopped", + "ports": [ + "3000:3000/tcp" + ], + "volumes": [ + "./data:/data" + ], + "environment": { + "CALNODE_ENCRYPTION_KEY": "${GENERATED_CALNODE_ENCRYPTION_KEY}", + "CALNODE_RECOVERY_SECRET": "${GENERATED_CALNODE_RECOVERY_SECRET}", + "DATABASE_URL": "sqlite:///data/calnode.db" + } + } + } + ], + "top_level": {}, + "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": "calnode-volume-0", + "service": "calnode", + "container_path": "/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "calnode" + ], + "stop_order": [ + "calnode" + ], + "dependency_readiness": "compose-healthcheck-then-port-or-process-fallback", + "rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes" + }, + "installer_inputs": { + "prompted": [ + "stack_name", + "base_vmid", + "rootfs_storage", + "persistent_data_destinations", + "frontend_bridge", + "frontend_ipv4_mode" + ], + "automatic": [ + "dependent_vmids", + "private_bridge", + "private_subnet", + "private_service_addresses", + "compose_service_aliases", + "generated_secrets", + "dependency_start_and_stop_order" + ], + "generated_secrets": [ + { + "id": "generated-calnode-calnode-encryption-key", + "strategy": "generate-cryptographically-random-at-install", + "bindings": [ + { + "service": "calnode", + "environment_variable": "CALNODE_ENCRYPTION_KEY" + } + ] + }, + { + "id": "generated-calnode-calnode-recovery-secret", + "strategy": "generate-cryptographically-random-at-install", + "bindings": [ + { + "service": "calnode", + "environment_variable": "CALNODE_RECOVERY_SECRET" + } + ] + } + ] + } + }, + "first_run": { + "endpoints": [ + { + "label": "Calnode", + "scheme": "http", + "port": 3000, + "path": "/admin/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": { + "CALNODE_ENCRYPTION_KEY": { + "strategy": "token-hex", + "bytes": 32 + }, + "CALNODE_RECOVERY_SECRET": { + "strategy": "token-hex", + "bytes": 32 + } + }, + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 3000, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/curated/cooktrace.json b/oci/catalog/curated/cooktrace.json new file mode 100644 index 00000000..1a68c3af --- /dev/null +++ b/oci/catalog/curated/cooktrace.json @@ -0,0 +1,353 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-cooktrace", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "CookTrace" + }, + "description": { + "en_US": "Self-hosted recipe manager for collecting, organizing, and sharing recipes." + }, + "category": "productivity", + "category_label": "Productivity & Workflows", + "author": "TraceApps", + "developer": "TraceApps", + "icon": "https://raw.githubusercontent.com/traceapps/cooktrace/main/public/icons/icon-512.png", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 3003, + "path": "/" + }, + "website": "https://github.com/traceapps/cooktrace", + "documentation": "https://github.com/traceapps/cooktrace#readme", + "repository": "https://github.com/traceapps/cooktrace", + "tips": [ + "The first-run wizard creates the initial administrator account." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "TraceApps", + "repository": "https://github.com/traceapps/cooktrace", + "default_branch": "main", + "revision": "f2734f0c4547fa605a935b20bb8e1516a8c39ba9", + "image_repository_url": "https://github.com/orgs/traceapps/packages/container/package/cooktrace", + "readme_pushed_at": "", + "compose_sha256": "97c6d80a15b18ba20e2740bd61220cb6907434a33ada01ffac476ebe89861989", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/traceapps/cooktrace/main/README.md" + }, + "container_contract": { + "service_name": "cooktrace", + "container_name": "cooktrace", + "image": { + "reference": "ghcr.io/traceapps/cooktrace:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/traceapps/cooktrace", + "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": "upstream-documentation" + }, + { + "name": "DB_PATH", + "example": "/data/db/cooktrace.db", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "UPLOADS_PATH", + "example": "/data/uploads", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/data/db", + "compose_source_example": "./data/db", + "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/uploads", + "compose_source_example": "./data/uploads", + "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": 3003, + "published_example": 3003, + "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 \"name\": \"cooktrace\",\n \"services\": {\n \"cooktrace\": {\n \"image\": \"ghcr.io/traceapps/cooktrace:latest\",\n \"container_name\": \"cooktrace\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"3003:3003/tcp\"\n ],\n \"volumes\": [\n \"./data/db:/data/db\",\n \"./data/uploads:/data/uploads\"\n ],\n \"environment\": {\n \"JWT_SECRET\": \"${GENERATED_JWT_SECRET}\",\n \"DB_PATH\": \"/data/db/cooktrace.db\",\n \"UPLOADS_PATH\": \"/data/uploads\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "cooktrace", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "cooktrace", + "service_count": 1, + "services": [ + { + "name": "cooktrace", + "image": "ghcr.io/traceapps/cooktrace:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/traceapps/cooktrace:latest", + "container_name": "cooktrace", + "restart": "unless-stopped", + "ports": [ + "3003:3003/tcp" + ], + "volumes": [ + "./data/db:/data/db", + "./data/uploads:/data/uploads" + ], + "environment": { + "JWT_SECRET": "${GENERATED_JWT_SECRET}", + "DB_PATH": "/data/db/cooktrace.db", + "UPLOADS_PATH": "/data/uploads" + } + } + } + ], + "top_level": {}, + "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": "cooktrace-volume-0", + "service": "cooktrace", + "container_path": "/data/db", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + }, + { + "id": "cooktrace-volume-1", + "service": "cooktrace", + "container_path": "/data/uploads", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "cooktrace" + ], + "stop_order": [ + "cooktrace" + ], + "dependency_readiness": "compose-healthcheck-then-port-or-process-fallback", + "rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes" + }, + "installer_inputs": { + "prompted": [ + "stack_name", + "base_vmid", + "rootfs_storage", + "persistent_data_destinations", + "frontend_bridge", + "frontend_ipv4_mode" + ], + "automatic": [ + "dependent_vmids", + "private_bridge", + "private_subnet", + "private_service_addresses", + "compose_service_aliases", + "generated_secrets", + "dependency_start_and_stop_order" + ], + "generated_secrets": [ + { + "id": "generated-cooktrace-jwt-secret", + "strategy": "generate-cryptographically-random-at-install", + "bindings": [ + { + "service": "cooktrace", + "environment_variable": "JWT_SECRET" + } + ] + } + ] + } + }, + "first_run": { + "endpoints": [ + { + "label": "CookTrace", + "scheme": "http", + "port": 3003, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": { + "JWT_SECRET": { + "strategy": "token-hex", + "bytes": 48 + } + }, + "volume_preparations": [ + { + "container_path": "/data/db", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data/uploads", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 3003, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/curated/degubase.json b/oci/catalog/curated/degubase.json new file mode 100644 index 00000000..92fd2c3d --- /dev/null +++ b/oci/catalog/curated/degubase.json @@ -0,0 +1,320 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-degubase", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Degubase" + }, + "description": { + "en_US": "A single-container web interface for building small relational workspaces backed by SQLite." + }, + "category": "databases", + "category_label": "Databases", + "author": "saintedlama", + "developer": "saintedlama", + "icon": "https://raw.githubusercontent.com/saintedlama/degubase/main/ui/public/assets/logo.svg", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64" + ], + "launch": { + "scheme": "http", + "port": 8080, + "path": "/" + }, + "website": "https://github.com/saintedlama/degubase", + "documentation": "https://github.com/saintedlama/degubase#readme", + "repository": "https://github.com/saintedlama/degubase", + "tips": [ + "The image stores workspace data under /data and configuration under /config. Authentication is configurable; review its security settings before publishing it." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "saintedlama", + "repository": "https://github.com/saintedlama/degubase", + "default_branch": "main", + "revision": "173257a2b0567ba91eef7454f174db9265f0f26c", + "image_repository_url": "https://github.com/orgs/saintedlama/packages/container/package/degubase", + "readme_pushed_at": "", + "compose_sha256": "f42e7bf9286f453d71411ffd69d9b18da1b209d51ef6f263f2ae60c7bc7e8616", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/saintedlama/degubase/main/README.md" + }, + "container_contract": { + "service_name": "degubase", + "container_name": "degubase", + "image": { + "reference": "ghcr.io/saintedlama/degubase:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/saintedlama/degubase", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "DEGUBASE_HOST", + "example": "0.0.0.0", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/data", + "compose_source_example": "./data", + "read_only": false, + "required": true, + "installation_choice": [ + "managed-volume", + "host-bind" + ], + "default": "managed-volume", + "managed_volume": { + "backup": true, + "default_size_gb": 4 + } + }, + { + "id": "volume-1", + "container_path": "/config", + "compose_source_example": "./config", + "read_only": false, + "required": true, + "installation_choice": [ + "managed-volume", + "host-bind" + ], + "default": "managed-volume", + "managed_volume": { + "backup": true, + "default_size_gb": 2 + } + } + ], + "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": "{\n \"name\": \"degubase\",\n \"services\": {\n \"degubase\": {\n \"image\": \"ghcr.io/saintedlama/degubase:latest\",\n \"container_name\": \"degubase\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"8080:8080/tcp\"\n ],\n \"volumes\": [\n \"./data:/data\",\n \"./config:/config\"\n ],\n \"environment\": {\n \"DEGUBASE_HOST\": \"0.0.0.0\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "degubase", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "degubase", + "service_count": 1, + "services": [ + { + "name": "degubase", + "image": "ghcr.io/saintedlama/degubase:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/saintedlama/degubase:latest", + "container_name": "degubase", + "restart": "unless-stopped", + "ports": [ + "8080:8080/tcp" + ], + "volumes": [ + "./data:/data", + "./config:/config" + ], + "environment": { + "DEGUBASE_HOST": "0.0.0.0" + } + } + } + ], + "top_level": {}, + "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": "degubase-volume-0", + "service": "degubase", + "container_path": "/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + }, + { + "id": "degubase-volume-1", + "service": "degubase", + "container_path": "/config", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "degubase" + ], + "stop_order": [ + "degubase" + ], + "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": "Degubase", + "scheme": "http", + "port": 8080, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 8080, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/curated/flagr.json b/oci/catalog/curated/flagr.json new file mode 100644 index 00000000..f931cd3b --- /dev/null +++ b/oci/catalog/curated/flagr.json @@ -0,0 +1,303 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-flagr", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Flagr" + }, + "description": { + "en_US": "Self-hosted feature-flag and experimentation service with a web interface and SQLite defaults." + }, + "category": "ai", + "category_label": "AI / Coding & Dev-Tools", + "author": "openflagr", + "developer": "openflagr", + "icon": "https://raw.githubusercontent.com/openflagr/flagr/main/docs/brand/flagr-mark.png", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 18000, + "path": "/" + }, + "website": "https://github.com/openflagr/flagr", + "documentation": "https://github.com/openflagr/flagr/blob/main/docs/flagr_self_host.md", + "repository": "https://github.com/openflagr/flagr", + "tips": [ + "This profile uses Flagr's built-in SQLite mode; no MySQL or PostgreSQL service is required." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "openflagr", + "repository": "https://github.com/openflagr/flagr", + "default_branch": "main", + "revision": "e026211babf05b0cc3431b6deb565f65df7ae3c7", + "image_repository_url": "https://github.com/orgs/openflagr/packages/container/package/flagr", + "readme_pushed_at": "", + "compose_sha256": "ec4044f5b9f5c33c67ed266efd16be2b0d4c929c7a6ce7fa3b03d858fc0f93d5", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/openflagr/flagr/main/README.md" + }, + "container_contract": { + "service_name": "flagr", + "container_name": "flagr", + "image": { + "reference": "ghcr.io/openflagr/flagr:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/openflagr/flagr", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "HOST", + "example": "0.0.0.0", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "FLAGR_DB_DBDRIVER", + "example": "sqlite3", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "FLAGR_DB_DBCONNECTIONSTR", + "example": "/data/flagr.sqlite", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/data", + "compose_source_example": "./data", + "read_only": false, + "required": true, + "installation_choice": [ + "managed-volume", + "host-bind" + ], + "default": "managed-volume", + "managed_volume": { + "backup": true, + "default_size_gb": 4 + } + } + ], + "ports": [ + { + "container_port": 18000, + "published_example": 18000, + "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 \"name\": \"flagr\",\n \"services\": {\n \"flagr\": {\n \"image\": \"ghcr.io/openflagr/flagr:latest\",\n \"container_name\": \"flagr\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"18000:18000/tcp\"\n ],\n \"volumes\": [\n \"./data:/data\"\n ],\n \"environment\": {\n \"HOST\": \"0.0.0.0\",\n \"FLAGR_DB_DBDRIVER\": \"sqlite3\",\n \"FLAGR_DB_DBCONNECTIONSTR\": \"/data/flagr.sqlite\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "flagr", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "flagr", + "service_count": 1, + "services": [ + { + "name": "flagr", + "image": "ghcr.io/openflagr/flagr:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/openflagr/flagr:latest", + "container_name": "flagr", + "restart": "unless-stopped", + "ports": [ + "18000:18000/tcp" + ], + "volumes": [ + "./data:/data" + ], + "environment": { + "HOST": "0.0.0.0", + "FLAGR_DB_DBDRIVER": "sqlite3", + "FLAGR_DB_DBCONNECTIONSTR": "/data/flagr.sqlite" + } + } + } + ], + "top_level": {}, + "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": "flagr-volume-0", + "service": "flagr", + "container_path": "/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "flagr" + ], + "stop_order": [ + "flagr" + ], + "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": "Flagr", + "scheme": "http", + "port": 18000, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 18000, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/curated/guestroll.json b/oci/catalog/curated/guestroll.json new file mode 100644 index 00000000..48d2edbb --- /dev/null +++ b/oci/catalog/curated/guestroll.json @@ -0,0 +1,307 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-guestroll", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Guestroll" + }, + "description": { + "en_US": "Self-hosted event photo gallery for guests, with moderation, QR-code sharing, and local SQLite storage." + }, + "category": "sharing", + "category_label": "Files & Sharing", + "author": "achedon12", + "developer": "achedon12", + "icon": "https://raw.githubusercontent.com/achedon12/guestroll/develop/src/app/icon.svg", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 3000, + "path": "/admin" + }, + "website": "https://github.com/achedon12/guestroll", + "documentation": "https://github.com/achedon12/guestroll#readme", + "repository": "https://github.com/achedon12/guestroll", + "tips": [ + "Sign in as admin at /admin. ADMIN_PASSWORD is requested at installation; PUBLIC_URL is initially set to the local LXC address.", + "Mobile camera access requires HTTPS; configure a reverse proxy before using that feature at an event." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "achedon12", + "repository": "https://github.com/achedon12/guestroll", + "default_branch": "develop", + "revision": "3fc407dd872a3e649b7ba505e2e6d80cefb9b82a", + "image_repository_url": "https://github.com/orgs/achedon12/packages/container/package/guestroll", + "readme_pushed_at": "", + "compose_sha256": "a02f45b0aacaf2a5e35a4554f3e35b547dc38011e693390d15f82f6c991c84e5", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/achedon12/guestroll/develop/README.md" + }, + "container_contract": { + "service_name": "guestroll", + "container_name": "guestroll", + "image": { + "reference": "ghcr.io/achedon12/guestroll:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/achedon12/guestroll", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "ADMIN_PASSWORD", + "example": null, + "required": true, + "sensitive": true, + "source": "upstream-documentation" + }, + { + "name": "PUBLIC_URL", + "example": "http://@CONTAINER_ADDRESS@:3000", + "required": true, + "sensitive": false, + "container_address": "http://@CONTAINER_ADDRESS@:3000", + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/data", + "compose_source_example": "./data", + "read_only": false, + "required": true, + "installation_choice": [ + "managed-volume", + "host-bind" + ], + "default": "managed-volume", + "managed_volume": { + "backup": true, + "default_size_gb": 8 + } + } + ], + "ports": [ + { + "container_port": 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": "{\n \"name\": \"guestroll\",\n \"services\": {\n \"guestroll\": {\n \"image\": \"ghcr.io/achedon12/guestroll:latest\",\n \"container_name\": \"guestroll\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"3000:3000/tcp\"\n ],\n \"volumes\": [\n \"./data:/data\"\n ],\n \"environment\": {\n \"ADMIN_PASSWORD\": null,\n \"PUBLIC_URL\": \"http://@CONTAINER_ADDRESS@:3000\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "guestroll", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "guestroll", + "service_count": 1, + "services": [ + { + "name": "guestroll", + "image": "ghcr.io/achedon12/guestroll:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/achedon12/guestroll:latest", + "container_name": "guestroll", + "restart": "unless-stopped", + "ports": [ + "3000:3000/tcp" + ], + "volumes": [ + "./data:/data" + ], + "environment": { + "ADMIN_PASSWORD": null, + "PUBLIC_URL": "http://@CONTAINER_ADDRESS@:3000" + } + } + } + ], + "top_level": {}, + "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": "guestroll-volume-0", + "service": "guestroll", + "container_path": "/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "guestroll" + ], + "stop_order": [ + "guestroll" + ], + "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": "Guestroll", + "scheme": "http", + "port": 3000, + "path": "/admin", + "source": "upstream-documentation" + } + ], + "credentials": [ + { + "label": "Guestroll administrator", + "type": "configured-or-installer-generated", + "username": "admin", + "password": null, + "password_environment": "ADMIN_PASSWORD", + "change_required": false, + "source": "upstream-documentation" + } + ] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 3000, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/curated/ihatemoney.json b/oci/catalog/curated/ihatemoney.json new file mode 100644 index 00000000..ba115bbd --- /dev/null +++ b/oci/catalog/curated/ihatemoney.json @@ -0,0 +1,352 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-ihatemoney", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "I Hate Money" + }, + "description": { + "en_US": "Self-hosted shared-expense and group-budget manager for tracking purchases and settling who owes whom." + }, + "category": "finance", + "category_label": "Finance & Budgeting", + "author": "spiral-project", + "developer": "spiral-project", + "icon": "https://raw.githubusercontent.com/spiral-project/ihatemoney/main/ihatemoney/static/favicon.ico", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 8000, + "path": "/" + }, + "website": "https://ihatemoney.org/", + "documentation": "https://ihatemoney.readthedocs.io/en/latest/installation.html#with-docker", + "repository": "https://github.com/spiral-project/ihatemoney", + "tips": [ + "The profile keeps the upstream admin dashboard disabled and public project creation enabled for the initial setup. Do not expose it publicly without reviewing those access settings.", + "The project is currently maintained with a focus on stability and maintenance rather than major new features." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "spiral-project", + "repository": "https://github.com/spiral-project/ihatemoney", + "default_branch": "main", + "revision": "e66a7672e8e5c41549bf53c4a824c72c43ab9079", + "image_repository_url": "https://hub.docker.com/r/ihatemoney/ihatemoney", + "readme_pushed_at": "", + "compose_sha256": "8a8be316e105a542379edca87eafadd0b9f42d980067b39ddcdab4fa71fce9c3", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/spiral-project/ihatemoney/main/README.md" + }, + "container_contract": { + "service_name": "ihatemoney", + "container_name": "ihatemoney", + "image": { + "reference": "docker.io/ihatemoney/ihatemoney:latest", + "registry": "docker.io", + "repository": "docker.io/ihatemoney/ihatemoney", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "SECRET_KEY", + "example": "${GENERATED_SECRET_KEY}", + "required": true, + "sensitive": true, + "source": "upstream-documentation" + }, + { + "name": "SQLALCHEMY_DATABASE_URI", + "example": "sqlite:////database/ihatemoney.db", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "SESSION_COOKIE_SECURE", + "example": "False", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "ACTIVATE_DEMO_PROJECT", + "example": "True", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "ACTIVATE_ADMIN_DASHBOARD", + "example": "False", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "ALLOW_PUBLIC_PROJECT_CREATION", + "example": "True", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "PORT", + "example": "8000", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/database", + "compose_source_example": "./database", + "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": "{\n \"name\": \"ihatemoney\",\n \"services\": {\n \"ihatemoney\": {\n \"image\": \"docker.io/ihatemoney/ihatemoney:latest\",\n \"container_name\": \"ihatemoney\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"8000:8000/tcp\"\n ],\n \"volumes\": [\n \"./database:/database\"\n ],\n \"environment\": {\n \"SECRET_KEY\": \"${GENERATED_SECRET_KEY}\",\n \"SQLALCHEMY_DATABASE_URI\": \"sqlite:////database/ihatemoney.db\",\n \"SESSION_COOKIE_SECURE\": \"False\",\n \"ACTIVATE_DEMO_PROJECT\": \"True\",\n \"ACTIVATE_ADMIN_DASHBOARD\": \"False\",\n \"ALLOW_PUBLIC_PROJECT_CREATION\": \"True\",\n \"PORT\": \"8000\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "ihatemoney", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "ihatemoney", + "service_count": 1, + "services": [ + { + "name": "ihatemoney", + "image": "docker.io/ihatemoney/ihatemoney:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "docker.io/ihatemoney/ihatemoney:latest", + "container_name": "ihatemoney", + "restart": "unless-stopped", + "ports": [ + "8000:8000/tcp" + ], + "volumes": [ + "./database:/database" + ], + "environment": { + "SECRET_KEY": "${GENERATED_SECRET_KEY}", + "SQLALCHEMY_DATABASE_URI": "sqlite:////database/ihatemoney.db", + "SESSION_COOKIE_SECURE": "False", + "ACTIVATE_DEMO_PROJECT": "True", + "ACTIVATE_ADMIN_DASHBOARD": "False", + "ALLOW_PUBLIC_PROJECT_CREATION": "True", + "PORT": "8000" + } + } + } + ], + "top_level": {}, + "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": "ihatemoney-volume-0", + "service": "ihatemoney", + "container_path": "/database", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "ihatemoney" + ], + "stop_order": [ + "ihatemoney" + ], + "dependency_readiness": "compose-healthcheck-then-port-or-process-fallback", + "rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes" + }, + "installer_inputs": { + "prompted": [ + "stack_name", + "base_vmid", + "rootfs_storage", + "persistent_data_destinations", + "frontend_bridge", + "frontend_ipv4_mode" + ], + "automatic": [ + "dependent_vmids", + "private_bridge", + "private_subnet", + "private_service_addresses", + "compose_service_aliases", + "generated_secrets", + "dependency_start_and_stop_order" + ], + "generated_secrets": [ + { + "id": "generated-ihatemoney-secret-key", + "strategy": "generate-cryptographically-random-at-install", + "bindings": [ + { + "service": "ihatemoney", + "environment_variable": "SECRET_KEY" + } + ] + } + ] + } + }, + "first_run": { + "endpoints": [ + { + "label": "I Hate Money", + "scheme": "http", + "port": 8000, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": { + "SECRET_KEY": { + "strategy": "token-hex", + "bytes": 32 + } + }, + "volume_preparations": [ + { + "container_path": "/database", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 8000, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/curated/imagesilo.json b/oci/catalog/curated/imagesilo.json new file mode 100644 index 00000000..36a00fff --- /dev/null +++ b/oci/catalog/curated/imagesilo.json @@ -0,0 +1,296 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-imagesilo", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "ImageSilo" + }, + "description": { + "en_US": "Self-hosted image-hosting service with authenticated uploads, image processing, public links, and local storage." + }, + "category": "sharing", + "category_label": "Files & Sharing", + "author": "Willxup", + "developer": "Willxup", + "icon": "https://raw.githubusercontent.com/Willxup/imagesilo/main/assets/brand/imagesilo-icon-512.png", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 8080, + "path": "/admin/setup" + }, + "website": "https://github.com/Willxup/imagesilo", + "documentation": "https://github.com/Willxup/imagesilo/blob/main/README.md", + "repository": "https://github.com/Willxup/imagesilo", + "tips": [ + "On first start, retrieve the one-time bootstrap token from the container log and enter it at /admin/setup to create the administrator.", + "Set IMAGESILO_COOKIE_SECURE=true when accessing the service through HTTPS." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "Willxup", + "repository": "https://github.com/Willxup/imagesilo", + "default_branch": "main", + "revision": "aecbdc402011f8a4bb8d0a4469786ab48db7d88a", + "image_repository_url": "https://github.com/orgs/Willxup/packages/container/package/imagesilo", + "readme_pushed_at": "", + "compose_sha256": "b1d73df6458fe0fb2c891f4f32eca925836c132ebbbccee9f95962ad0e4b7121", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/Willxup/imagesilo/main/README.md" + }, + "container_contract": { + "service_name": "imagesilo", + "container_name": "imagesilo", + "image": { + "reference": "ghcr.io/willxup/imagesilo:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/willxup/imagesilo", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "IMAGESILO_COOKIE_SECURE", + "example": "false", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "IMAGESILO_PROCESSING_CONCURRENCY", + "example": "1", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/data", + "compose_source_example": "./data", + "read_only": false, + "required": true, + "installation_choice": [ + "managed-volume", + "host-bind" + ], + "default": "managed-volume", + "managed_volume": { + "backup": true, + "default_size_gb": 8 + } + } + ], + "ports": [ + { + "container_port": 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": "{\n \"name\": \"imagesilo\",\n \"services\": {\n \"imagesilo\": {\n \"image\": \"ghcr.io/willxup/imagesilo:latest\",\n \"container_name\": \"imagesilo\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"8080:8080/tcp\"\n ],\n \"volumes\": [\n \"./data:/data\"\n ],\n \"environment\": {\n \"IMAGESILO_COOKIE_SECURE\": \"false\",\n \"IMAGESILO_PROCESSING_CONCURRENCY\": \"1\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "imagesilo", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "imagesilo", + "service_count": 1, + "services": [ + { + "name": "imagesilo", + "image": "ghcr.io/willxup/imagesilo:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/willxup/imagesilo:latest", + "container_name": "imagesilo", + "restart": "unless-stopped", + "ports": [ + "8080:8080/tcp" + ], + "volumes": [ + "./data:/data" + ], + "environment": { + "IMAGESILO_COOKIE_SECURE": "false", + "IMAGESILO_PROCESSING_CONCURRENCY": "1" + } + } + } + ], + "top_level": {}, + "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": "imagesilo-volume-0", + "service": "imagesilo", + "container_path": "/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "imagesilo" + ], + "stop_order": [ + "imagesilo" + ], + "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": "ImageSilo", + "scheme": "http", + "port": 8080, + "path": "/admin/setup", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 8080, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/curated/instatic.json b/oci/catalog/curated/instatic.json new file mode 100644 index 00000000..a993296d --- /dev/null +++ b/oci/catalog/curated/instatic.json @@ -0,0 +1,368 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-instatic", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Instatic" + }, + "description": { + "en_US": "Single-server website CMS and visual editor with SQLite-backed content, media uploads, forms, and publishing." + }, + "category": "web", + "category_label": "Webservers & Proxies", + "author": "CoreBunch", + "developer": "CoreBunch", + "icon": "https://raw.githubusercontent.com/CoreBunch/Instatic/main/public/favicon.svg", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64" + ], + "launch": { + "scheme": "http", + "port": 3001, + "path": "/admin" + }, + "website": "https://github.com/CoreBunch/Instatic", + "documentation": "https://github.com/CoreBunch/Instatic/blob/main/docs/deployment/vps.md", + "repository": "https://github.com/CoreBunch/Instatic", + "tips": [ + "The initial visit at /admin creates the site and administrator. INSTATIC_SECRET_KEY is generated and persisted with the recipe; back up the volume." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "CoreBunch", + "repository": "https://github.com/CoreBunch/Instatic", + "default_branch": "main", + "revision": "1a7ab33ff1614e80b2f618b284dd55b0e2b9d9ae", + "image_repository_url": "https://github.com/orgs/CoreBunch/packages/container/package/instatic", + "readme_pushed_at": "", + "compose_sha256": "b8b34bcb67ace12f558f3a93b2363bfd525992ea66c9dd89b9cb53258087a16f", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/CoreBunch/Instatic/main/README.md" + }, + "container_contract": { + "service_name": "instatic", + "container_name": "instatic", + "image": { + "reference": "ghcr.io/corebunch/instatic:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/corebunch/instatic", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "PORT", + "example": "3001", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "DATABASE_URL", + "example": "sqlite:/app/data/cms.db", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "UPLOADS_DIR", + "example": "/app/uploads", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "STATIC_DIR", + "example": "/app/dist", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "INSTATIC_SECRET_KEY", + "example": "${GENERATED_INSTATIC_SECRET_KEY}", + "required": true, + "sensitive": true, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/app/data", + "compose_source_example": "./data", + "read_only": false, + "required": true, + "installation_choice": [ + "managed-volume", + "host-bind" + ], + "default": "managed-volume", + "managed_volume": { + "backup": true, + "default_size_gb": 8 + } + }, + { + "id": "volume-1", + "container_path": "/app/uploads", + "compose_source_example": "./uploads", + "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": 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": "{\n \"name\": \"instatic\",\n \"services\": {\n \"instatic\": {\n \"image\": \"ghcr.io/corebunch/instatic:latest\",\n \"container_name\": \"instatic\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"3001:3001/tcp\"\n ],\n \"volumes\": [\n \"./data:/app/data\",\n \"./uploads:/app/uploads\"\n ],\n \"environment\": {\n \"PORT\": \"3001\",\n \"DATABASE_URL\": \"sqlite:/app/data/cms.db\",\n \"UPLOADS_DIR\": \"/app/uploads\",\n \"STATIC_DIR\": \"/app/dist\",\n \"INSTATIC_SECRET_KEY\": \"${GENERATED_INSTATIC_SECRET_KEY}\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "instatic", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "instatic", + "service_count": 1, + "services": [ + { + "name": "instatic", + "image": "ghcr.io/corebunch/instatic:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/corebunch/instatic:latest", + "container_name": "instatic", + "restart": "unless-stopped", + "ports": [ + "3001:3001/tcp" + ], + "volumes": [ + "./data:/app/data", + "./uploads:/app/uploads" + ], + "environment": { + "PORT": "3001", + "DATABASE_URL": "sqlite:/app/data/cms.db", + "UPLOADS_DIR": "/app/uploads", + "STATIC_DIR": "/app/dist", + "INSTATIC_SECRET_KEY": "${GENERATED_INSTATIC_SECRET_KEY}" + } + } + } + ], + "top_level": {}, + "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": "instatic-volume-0", + "service": "instatic", + "container_path": "/app/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + }, + { + "id": "instatic-volume-1", + "service": "instatic", + "container_path": "/app/uploads", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "instatic" + ], + "stop_order": [ + "instatic" + ], + "dependency_readiness": "compose-healthcheck-then-port-or-process-fallback", + "rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes" + }, + "installer_inputs": { + "prompted": [ + "stack_name", + "base_vmid", + "rootfs_storage", + "persistent_data_destinations", + "frontend_bridge", + "frontend_ipv4_mode" + ], + "automatic": [ + "dependent_vmids", + "private_bridge", + "private_subnet", + "private_service_addresses", + "compose_service_aliases", + "generated_secrets", + "dependency_start_and_stop_order" + ], + "generated_secrets": [ + { + "id": "generated-instatic-instatic-secret-key", + "strategy": "generate-cryptographically-random-at-install", + "bindings": [ + { + "service": "instatic", + "environment_variable": "INSTATIC_SECRET_KEY" + } + ] + } + ] + } + }, + "first_run": { + "endpoints": [ + { + "label": "Instatic", + "scheme": "http", + "port": 3001, + "path": "/admin", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": { + "INSTATIC_SECRET_KEY": { + "strategy": "token-hex", + "bytes": 24 + } + }, + "volume_preparations": [ + { + "container_path": "/app/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/app/uploads", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 3001, + "path": "/health", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/curated/invoiceshelf.json b/oci/catalog/curated/invoiceshelf.json new file mode 100644 index 00000000..2690d539 --- /dev/null +++ b/oci/catalog/curated/invoiceshelf.json @@ -0,0 +1,387 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-invoiceshelf", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "InvoiceShelf" + }, + "description": { + "en_US": "Self-hosted invoicing and estimates with customer portals, recurring billing, payments, and expense tracking." + }, + "category": "business", + "category_label": "Business & ERP", + "author": "InvoiceShelf", + "developer": "InvoiceShelf", + "icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/invoiceshelf.webp", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 8080, + "path": "/" + }, + "website": "https://github.com/InvoiceShelf/InvoiceShelf", + "documentation": "https://github.com/InvoiceShelf/docker#readme", + "repository": "https://github.com/InvoiceShelf/InvoiceShelf", + "tips": [ + "The initial visit opens the setup wizard. The SQLite database is stored under /var/www/html/storage.", + "The upstream Docker image includes the web server and scheduler in one image; there is no database or scheduler container to add." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "InvoiceShelf", + "repository": "https://github.com/InvoiceShelf/docker", + "default_branch": "master", + "revision": "479f2396569959064fc6ca7a2bb36af30920d199", + "image_repository_url": "https://hub.docker.com/r/invoiceshelf/invoiceshelf", + "readme_pushed_at": "", + "compose_sha256": "5c855909373c8b9a8f3c4997fd24e06d8f11f303a2f318ddf084b6185efc43b4", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/InvoiceShelf/docker/master/README.md" + }, + "container_contract": { + "service_name": "invoiceshelf", + "container_name": "invoiceshelf", + "image": { + "reference": "docker.io/invoiceshelf/invoiceshelf:latest", + "registry": "docker.io", + "repository": "docker.io/invoiceshelf/invoiceshelf", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "APP_NAME", + "example": "InvoiceShelf", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "APP_ENV", + "example": "production", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "APP_DEBUG", + "example": "false", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "APP_URL", + "example": "http://@CONTAINER_ADDRESS@:8080", + "required": true, + "sensitive": false, + "container_address": "http://@CONTAINER_ADDRESS@:8080", + "source": "upstream-documentation" + }, + { + "name": "DB_CONNECTION", + "example": "sqlite", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "DB_DATABASE", + "example": "/var/www/html/storage/app/database.sqlite", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "CACHE_STORE", + "example": "file", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "SESSION_DRIVER", + "example": "file", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "SESSION_LIFETIME", + "example": "240", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/var/www/html/storage", + "compose_source_example": "./invoiceshelf/storage", + "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/html/Modules", + "compose_source_example": "./invoiceshelf/modules", + "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": 8090, + "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 \"name\": \"invoiceshelf\",\n \"services\": {\n \"invoiceshelf\": {\n \"image\": \"docker.io/invoiceshelf/invoiceshelf:latest\",\n \"container_name\": \"invoiceshelf\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"8090:8080/tcp\"\n ],\n \"volumes\": [\n \"./invoiceshelf/storage:/var/www/html/storage\",\n \"./invoiceshelf/modules:/var/www/html/Modules\"\n ],\n \"environment\": {\n \"APP_NAME\": \"InvoiceShelf\",\n \"APP_ENV\": \"production\",\n \"APP_DEBUG\": \"false\",\n \"APP_URL\": \"http://@CONTAINER_ADDRESS@:8080\",\n \"DB_CONNECTION\": \"sqlite\",\n \"DB_DATABASE\": \"/var/www/html/storage/app/database.sqlite\",\n \"CACHE_STORE\": \"file\",\n \"SESSION_DRIVER\": \"file\",\n \"SESSION_LIFETIME\": \"240\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "invoiceshelf", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "invoiceshelf", + "service_count": 1, + "services": [ + { + "name": "invoiceshelf", + "image": "docker.io/invoiceshelf/invoiceshelf:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "docker.io/invoiceshelf/invoiceshelf:latest", + "container_name": "invoiceshelf", + "restart": "unless-stopped", + "ports": [ + "8090:8080/tcp" + ], + "volumes": [ + "./invoiceshelf/storage:/var/www/html/storage", + "./invoiceshelf/modules:/var/www/html/Modules" + ], + "environment": { + "APP_NAME": "InvoiceShelf", + "APP_ENV": "production", + "APP_DEBUG": "false", + "APP_URL": "http://@CONTAINER_ADDRESS@:8080", + "DB_CONNECTION": "sqlite", + "DB_DATABASE": "/var/www/html/storage/app/database.sqlite", + "CACHE_STORE": "file", + "SESSION_DRIVER": "file", + "SESSION_LIFETIME": "240" + } + } + } + ], + "top_level": {}, + "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": "invoiceshelf-volume-0", + "service": "invoiceshelf", + "container_path": "/var/www/html/storage", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + }, + { + "id": "invoiceshelf-volume-1", + "service": "invoiceshelf", + "container_path": "/var/www/html/Modules", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "invoiceshelf" + ], + "stop_order": [ + "invoiceshelf" + ], + "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": "InvoiceShelf", + "scheme": "http", + "port": 8080, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [ + { + "container_path": "/var/www/html/storage", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/var/www/html/Modules", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 8080, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/curated/kroma.json b/oci/catalog/curated/kroma.json new file mode 100644 index 00000000..83697bca --- /dev/null +++ b/oci/catalog/curated/kroma.json @@ -0,0 +1,311 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-kroma", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "KROMA" + }, + "description": { + "en_US": "Personal media server for browsing and playing a local video library, with direct play and optional modules." + }, + "category": "media", + "category_label": "Media & Streaming", + "author": "kromatv", + "developer": "kromatv", + "icon": "https://raw.githubusercontent.com/kromatv/kroma/main/.github/assets/logo.svg", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 4040, + "path": "/" + }, + "website": "https://github.com/kromatv/kroma", + "documentation": "https://github.com/kromatv/kroma#readme", + "repository": "https://github.com/kromatv/kroma", + "tips": [ + "Without KROMA_MEDIA_DIRS configured, the server seeds demo titles. To browse your own library, add a host media directory at /media and configure KROMA_MEDIA_DIRS=/media.", + "KROMA modules can start additional processes when enabled; this profile installs only the base server image." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "kromatv", + "repository": "https://github.com/kromatv/kroma", + "default_branch": "main", + "revision": "616024831f332d3c24a6ebc6afc2dd5a1148b63f", + "image_repository_url": "https://github.com/orgs/kromatv/packages/container/package/kroma", + "readme_pushed_at": "", + "compose_sha256": "0eef24d6d6c187a1188ba00183d7a8f4dc7244e1ca13dea3dbf5fc57e9c6c3d6", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/kromatv/kroma/main/README.md" + }, + "container_contract": { + "service_name": "kroma", + "container_name": "kroma", + "image": { + "reference": "ghcr.io/kromatv/kroma:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/kromatv/kroma", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "KROMA_MEDIA_DIRS", + "example": "/media", + "required": false, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/data", + "compose_source_example": "./data", + "read_only": false, + "required": true, + "installation_choice": [ + "managed-volume", + "host-bind" + ], + "default": "managed-volume", + "managed_volume": { + "backup": true, + "default_size_gb": 8 + } + }, + { + "id": "volume-1", + "container_path": "/media", + "compose_source_example": "/path/to/video-library", + "read_only": true, + "required": false, + "installation_choice": [ + "host-bind", + "skip" + ], + "default": "skip", + "managed_volume": { + "backup": false, + "default_size_gb": 1 + } + } + ], + "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": "{\n \"name\": \"kroma\",\n \"services\": {\n \"kroma\": {\n \"image\": \"ghcr.io/kromatv/kroma:latest\",\n \"container_name\": \"kroma\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"4040:4040/tcp\"\n ],\n \"volumes\": [\n \"./data:/data\",\n \"/path/to/video-library:/media:ro\"\n ],\n \"environment\": {\n \"KROMA_MEDIA_DIRS\": \"/media\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "kroma", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "kroma", + "service_count": 1, + "services": [ + { + "name": "kroma", + "image": "ghcr.io/kromatv/kroma:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/kromatv/kroma:latest", + "container_name": "kroma", + "restart": "unless-stopped", + "ports": [ + "4040:4040/tcp" + ], + "volumes": [ + "./data:/data", + "/path/to/video-library:/media:ro" + ], + "environment": { + "KROMA_MEDIA_DIRS": "/media" + } + } + } + ], + "top_level": {}, + "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": "kroma-volume-0", + "service": "kroma", + "container_path": "/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "kroma" + ], + "stop_order": [ + "kroma" + ], + "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": "KROMA", + "scheme": "http", + "port": 4040, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/media", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 4040, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/curated/libre-closet.json b/oci/catalog/curated/libre-closet.json new file mode 100644 index 00000000..be917559 --- /dev/null +++ b/oci/catalog/curated/libre-closet.json @@ -0,0 +1,303 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-libre-closet", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Libre Closet" + }, + "description": { + "en_US": "Self-hosted wardrobe catalog for organizing clothing, outfits, and personal style with SQLite and local file storage." + }, + "category": "productivity", + "category_label": "Productivity & Workflows", + "author": "lazztech", + "developer": "lazztech", + "icon": "https://raw.githubusercontent.com/lazztech/Libre-Closet/main/public/favicon.ico", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 3000, + "path": "/" + }, + "website": "https://github.com/lazztech/Libre-Closet", + "documentation": "https://github.com/lazztech/Libre-Closet#readme", + "repository": "https://github.com/lazztech/Libre-Closet", + "tips": [ + "Upstream defaults to AUTH_ENABLED=false. Keep this service on a trusted network or enable authentication and configure accounts before exposing it beyond your LAN." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "lazztech", + "repository": "https://github.com/lazztech/Libre-Closet", + "default_branch": "main", + "revision": "08f66dd9fe071e3b62e529d0ca4050169d31532d", + "image_repository_url": "https://github.com/orgs/lazztech/packages/container/package/libre-closet", + "readme_pushed_at": "", + "compose_sha256": "55286f8ae33f8a4e91d9224ff1804e99b41fd9d5045409cbef3641be211c34c5", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/lazztech/Libre-Closet/main/README.md" + }, + "container_contract": { + "service_name": "libre-closet", + "container_name": "libre-closet", + "image": { + "reference": "ghcr.io/lazztech/libre-closet:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/lazztech/libre-closet", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "AUTH_ENABLED", + "example": "false", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "PWA_ENABLED", + "example": "true", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "DATA_PATH", + "example": "/app/data", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/app/data", + "compose_source_example": "./data", + "read_only": false, + "required": true, + "installation_choice": [ + "managed-volume", + "host-bind" + ], + "default": "managed-volume", + "managed_volume": { + "backup": true, + "default_size_gb": 8 + } + } + ], + "ports": [ + { + "container_port": 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": "{\n \"name\": \"libre-closet\",\n \"services\": {\n \"libre-closet\": {\n \"image\": \"ghcr.io/lazztech/libre-closet:latest\",\n \"container_name\": \"libre-closet\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"3000:3000/tcp\"\n ],\n \"volumes\": [\n \"./data:/app/data\"\n ],\n \"environment\": {\n \"AUTH_ENABLED\": \"false\",\n \"PWA_ENABLED\": \"true\",\n \"DATA_PATH\": \"/app/data\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "libre-closet", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "libre-closet", + "service_count": 1, + "services": [ + { + "name": "libre-closet", + "image": "ghcr.io/lazztech/libre-closet:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/lazztech/libre-closet:latest", + "container_name": "libre-closet", + "restart": "unless-stopped", + "ports": [ + "3000:3000/tcp" + ], + "volumes": [ + "./data:/app/data" + ], + "environment": { + "AUTH_ENABLED": "false", + "PWA_ENABLED": "true", + "DATA_PATH": "/app/data" + } + } + } + ], + "top_level": {}, + "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": "libre-closet-volume-0", + "service": "libre-closet", + "container_path": "/app/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "libre-closet" + ], + "stop_order": [ + "libre-closet" + ], + "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": "Libre Closet", + "scheme": "http", + "port": 3000, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [ + { + "container_path": "/app/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 3000, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/curated/lifttrace.json b/oci/catalog/curated/lifttrace.json new file mode 100644 index 00000000..3e506017 --- /dev/null +++ b/oci/catalog/curated/lifttrace.json @@ -0,0 +1,353 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-lifttrace", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "LiftTrace" + }, + "description": { + "en_US": "Self-hosted strength-training tracker with workout logs, programs, progress photos, and a mobile PWA." + }, + "category": "productivity", + "category_label": "Productivity & Workflows", + "author": "TraceApps", + "developer": "TraceApps", + "icon": "https://raw.githubusercontent.com/traceapps/lifttrace/main/public/icons/icon-512.png", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 3002, + "path": "/" + }, + "website": "https://github.com/traceapps/lifttrace", + "documentation": "https://github.com/traceapps/lifttrace#readme", + "repository": "https://github.com/traceapps/lifttrace", + "tips": [ + "The first-run wizard creates the initial administrator account." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "TraceApps", + "repository": "https://github.com/traceapps/lifttrace", + "default_branch": "main", + "revision": "bfde1fef9c8c38508197cd679ad646f3385ec5d8", + "image_repository_url": "https://github.com/orgs/traceapps/packages/container/package/lifttrace", + "readme_pushed_at": "", + "compose_sha256": "5e271146d220f3fda16a48b9e996f5a3df111461e36b4542fa91f245876af101", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/traceapps/lifttrace/main/README.md" + }, + "container_contract": { + "service_name": "lifttrace", + "container_name": "lifttrace", + "image": { + "reference": "ghcr.io/traceapps/lifttrace:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/traceapps/lifttrace", + "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": "upstream-documentation" + }, + { + "name": "DB_PATH", + "example": "/data/db/lifttrace.db", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "UPLOADS_PATH", + "example": "/data/uploads", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/data/db", + "compose_source_example": "./data/db", + "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/uploads", + "compose_source_example": "./data/uploads", + "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": 3002, + "published_example": 3002, + "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 \"name\": \"lifttrace\",\n \"services\": {\n \"lifttrace\": {\n \"image\": \"ghcr.io/traceapps/lifttrace:latest\",\n \"container_name\": \"lifttrace\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"3002:3002/tcp\"\n ],\n \"volumes\": [\n \"./data/db:/data/db\",\n \"./data/uploads:/data/uploads\"\n ],\n \"environment\": {\n \"JWT_SECRET\": \"${GENERATED_JWT_SECRET}\",\n \"DB_PATH\": \"/data/db/lifttrace.db\",\n \"UPLOADS_PATH\": \"/data/uploads\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "lifttrace", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "lifttrace", + "service_count": 1, + "services": [ + { + "name": "lifttrace", + "image": "ghcr.io/traceapps/lifttrace:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/traceapps/lifttrace:latest", + "container_name": "lifttrace", + "restart": "unless-stopped", + "ports": [ + "3002:3002/tcp" + ], + "volumes": [ + "./data/db:/data/db", + "./data/uploads:/data/uploads" + ], + "environment": { + "JWT_SECRET": "${GENERATED_JWT_SECRET}", + "DB_PATH": "/data/db/lifttrace.db", + "UPLOADS_PATH": "/data/uploads" + } + } + } + ], + "top_level": {}, + "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": "lifttrace-volume-0", + "service": "lifttrace", + "container_path": "/data/db", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + }, + { + "id": "lifttrace-volume-1", + "service": "lifttrace", + "container_path": "/data/uploads", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "lifttrace" + ], + "stop_order": [ + "lifttrace" + ], + "dependency_readiness": "compose-healthcheck-then-port-or-process-fallback", + "rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes" + }, + "installer_inputs": { + "prompted": [ + "stack_name", + "base_vmid", + "rootfs_storage", + "persistent_data_destinations", + "frontend_bridge", + "frontend_ipv4_mode" + ], + "automatic": [ + "dependent_vmids", + "private_bridge", + "private_subnet", + "private_service_addresses", + "compose_service_aliases", + "generated_secrets", + "dependency_start_and_stop_order" + ], + "generated_secrets": [ + { + "id": "generated-lifttrace-jwt-secret", + "strategy": "generate-cryptographically-random-at-install", + "bindings": [ + { + "service": "lifttrace", + "environment_variable": "JWT_SECRET" + } + ] + } + ] + } + }, + "first_run": { + "endpoints": [ + { + "label": "LiftTrace", + "scheme": "http", + "port": 3002, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": { + "JWT_SECRET": { + "strategy": "token-hex", + "bytes": 48 + } + }, + "volume_preparations": [ + { + "container_path": "/data/db", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data/uploads", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 3002, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/curated/maintainerr.json b/oci/catalog/curated/maintainerr.json new file mode 100644 index 00000000..4e9b146d --- /dev/null +++ b/oci/catalog/curated/maintainerr.json @@ -0,0 +1,288 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-maintainerr", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Maintainerr" + }, + "description": { + "en_US": "Self-hosted media-library cleanup and maintenance dashboard for Plex, Jellyfin, or Emby." + }, + "category": "media", + "category_label": "Media & Streaming", + "author": "Maintainerr", + "developer": "Maintainerr", + "icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/maintainerr.webp", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 6246, + "path": "/" + }, + "website": "https://github.com/Maintainerr/Maintainerr", + "documentation": "https://github.com/Maintainerr/Maintainerr#readme", + "repository": "https://github.com/Maintainerr/Maintainerr", + "tips": [ + "To manage a library, configure an external Plex, Jellyfin, or Emby server in the UI. CPU feature x86-64-v2 is required for overlays and collection-poster image processing; the UI can still start without it." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "Maintainerr", + "repository": "https://github.com/Maintainerr/Maintainerr", + "default_branch": "development", + "revision": "518078a712c8223b32e4d5817c8a90851c6c0743", + "image_repository_url": "https://github.com/orgs/Maintainerr/packages/container/package/maintainerr", + "readme_pushed_at": "", + "compose_sha256": "70d646e01856512988acdb119804c3ddb6c516d809c4b44c33806cefe42753e9", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/Maintainerr/Maintainerr/development/README.md" + }, + "container_contract": { + "service_name": "maintainerr", + "container_name": "maintainerr", + "image": { + "reference": "ghcr.io/maintainerr/maintainerr:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/maintainerr/maintainerr", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "TZ", + "example": "Europe/Madrid", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/opt/data", + "compose_source_example": "./data", + "read_only": false, + "required": true, + "installation_choice": [ + "managed-volume", + "host-bind" + ], + "default": "managed-volume", + "managed_volume": { + "backup": true, + "default_size_gb": 4 + } + } + ], + "ports": [ + { + "container_port": 6246, + "published_example": 6246, + "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 \"name\": \"maintainerr\",\n \"services\": {\n \"maintainerr\": {\n \"image\": \"ghcr.io/maintainerr/maintainerr:latest\",\n \"container_name\": \"maintainerr\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"6246:6246/tcp\"\n ],\n \"volumes\": [\n \"./data:/opt/data\"\n ],\n \"environment\": {\n \"TZ\": \"Europe/Madrid\"\n },\n \"user\": \"1000:1000\"\n }\n }\n}" + }, + "compose_stack": { + "project_name": "maintainerr", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "maintainerr", + "service_count": 1, + "services": [ + { + "name": "maintainerr", + "image": "ghcr.io/maintainerr/maintainerr:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/maintainerr/maintainerr:latest", + "container_name": "maintainerr", + "restart": "unless-stopped", + "ports": [ + "6246:6246/tcp" + ], + "volumes": [ + "./data:/opt/data" + ], + "environment": { + "TZ": "Europe/Madrid" + }, + "user": "1000:1000" + } + } + ], + "top_level": {}, + "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": "maintainerr-volume-0", + "service": "maintainerr", + "container_path": "/opt/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "maintainerr" + ], + "stop_order": [ + "maintainerr" + ], + "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": "Maintainerr", + "scheme": "http", + "port": 6246, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [ + { + "container_path": "/opt/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 6246, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/curated/notara.json b/oci/catalog/curated/notara.json new file mode 100644 index 00000000..db9b988b --- /dev/null +++ b/oci/catalog/curated/notara.json @@ -0,0 +1,303 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-notara", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Notara" + }, + "description": { + "en_US": "Self-hosted collaborative notes and knowledge base with pages, inline databases, and SQLite storage." + }, + "category": "documents", + "category_label": "Documents & Notes", + "author": "DnzzL", + "developer": "DnzzL", + "icon": "https://raw.githubusercontent.com/DnzzL/notara/main/packages/app/public/icon-512.svg", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 3000, + "path": "/" + }, + "website": "https://github.com/DnzzL/notara", + "documentation": "https://github.com/DnzzL/notara#readme", + "repository": "https://github.com/DnzzL/notara", + "tips": [ + "Create the initial account through the web interface. SMTP is optional and is needed only for invitations and password resets." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "DnzzL", + "repository": "https://github.com/DnzzL/notara", + "default_branch": "main", + "revision": "46dddd593651fe452ab0cc0951504d76d468e862", + "image_repository_url": "https://github.com/orgs/dnzzl/packages/container/package/notara", + "readme_pushed_at": "", + "compose_sha256": "7b74dd1c9a15ae341a165b646053c1fccccb948adc5b773134ccf04bd80ecb1a", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/DnzzL/notara/main/README.md" + }, + "container_contract": { + "service_name": "notara", + "container_name": "notara", + "image": { + "reference": "ghcr.io/dnzzl/notara:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/dnzzl/notara", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "BETTER_AUTH_SECRET", + "example": "${GENERATED_BETTER_AUTH_SECRET}", + "required": true, + "sensitive": true, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/data", + "compose_source_example": "./data", + "read_only": false, + "required": true, + "installation_choice": [ + "managed-volume", + "host-bind" + ], + "default": "managed-volume", + "managed_volume": { + "backup": true, + "default_size_gb": 8 + } + } + ], + "ports": [ + { + "container_port": 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": "{\n \"name\": \"notara\",\n \"services\": {\n \"notara\": {\n \"image\": \"ghcr.io/dnzzl/notara:latest\",\n \"container_name\": \"notara\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"3000:3000/tcp\"\n ],\n \"volumes\": [\n \"./data:/data\"\n ],\n \"environment\": {\n \"BETTER_AUTH_SECRET\": \"${GENERATED_BETTER_AUTH_SECRET}\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "notara", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "notara", + "service_count": 1, + "services": [ + { + "name": "notara", + "image": "ghcr.io/dnzzl/notara:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/dnzzl/notara:latest", + "container_name": "notara", + "restart": "unless-stopped", + "ports": [ + "3000:3000/tcp" + ], + "volumes": [ + "./data:/data" + ], + "environment": { + "BETTER_AUTH_SECRET": "${GENERATED_BETTER_AUTH_SECRET}" + } + } + } + ], + "top_level": {}, + "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": "notara-volume-0", + "service": "notara", + "container_path": "/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "notara" + ], + "stop_order": [ + "notara" + ], + "dependency_readiness": "compose-healthcheck-then-port-or-process-fallback", + "rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes" + }, + "installer_inputs": { + "prompted": [ + "stack_name", + "base_vmid", + "rootfs_storage", + "persistent_data_destinations", + "frontend_bridge", + "frontend_ipv4_mode" + ], + "automatic": [ + "dependent_vmids", + "private_bridge", + "private_subnet", + "private_service_addresses", + "compose_service_aliases", + "generated_secrets", + "dependency_start_and_stop_order" + ], + "generated_secrets": [ + { + "id": "generated-notara-better-auth-secret", + "strategy": "generate-cryptographically-random-at-install", + "bindings": [ + { + "service": "notara", + "environment_variable": "BETTER_AUTH_SECRET" + } + ] + } + ] + } + }, + "first_run": { + "endpoints": [ + { + "label": "Notara", + "scheme": "http", + "port": 3000, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": { + "BETTER_AUTH_SECRET": { + "strategy": "token-hex", + "bytes": 32 + } + }, + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 3000, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/curated/notetrace.json b/oci/catalog/curated/notetrace.json new file mode 100644 index 00000000..2e9008ef --- /dev/null +++ b/oci/catalog/curated/notetrace.json @@ -0,0 +1,353 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-notetrace", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "NoteTrace" + }, + "description": { + "en_US": "Self-hosted notes and notebooks with attachments, backups, and optional multi-user accounts." + }, + "category": "documents", + "category_label": "Documents & Notes", + "author": "TraceApps", + "developer": "TraceApps", + "icon": "https://raw.githubusercontent.com/traceapps/notetrace/main/public/icons/icon-512.png", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 3004, + "path": "/" + }, + "website": "https://github.com/traceapps/notetrace", + "documentation": "https://github.com/traceapps/notetrace#readme", + "repository": "https://github.com/traceapps/notetrace", + "tips": [ + "The first-run wizard creates the initial administrator account." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "TraceApps", + "repository": "https://github.com/traceapps/notetrace", + "default_branch": "main", + "revision": "0a3bf0b33531b940a069d98e1928f29d48894d6e", + "image_repository_url": "https://github.com/orgs/traceapps/packages/container/package/notetrace", + "readme_pushed_at": "", + "compose_sha256": "69d694f8c1e557f51dacd5a2427acc3d1ec47ce0207b70e518b18ca1ca7e6137", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/traceapps/notetrace/main/README.md" + }, + "container_contract": { + "service_name": "notetrace", + "container_name": "notetrace", + "image": { + "reference": "ghcr.io/traceapps/notetrace:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/traceapps/notetrace", + "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": "upstream-documentation" + }, + { + "name": "DB_PATH", + "example": "/data/db/notetrace.db", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "UPLOADS_PATH", + "example": "/data/uploads", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/data/db", + "compose_source_example": "./data/db", + "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/uploads", + "compose_source_example": "./data/uploads", + "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": 3004, + "published_example": 3004, + "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 \"name\": \"notetrace\",\n \"services\": {\n \"notetrace\": {\n \"image\": \"ghcr.io/traceapps/notetrace:latest\",\n \"container_name\": \"notetrace\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"3004:3004/tcp\"\n ],\n \"volumes\": [\n \"./data/db:/data/db\",\n \"./data/uploads:/data/uploads\"\n ],\n \"environment\": {\n \"JWT_SECRET\": \"${GENERATED_JWT_SECRET}\",\n \"DB_PATH\": \"/data/db/notetrace.db\",\n \"UPLOADS_PATH\": \"/data/uploads\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "notetrace", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "notetrace", + "service_count": 1, + "services": [ + { + "name": "notetrace", + "image": "ghcr.io/traceapps/notetrace:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/traceapps/notetrace:latest", + "container_name": "notetrace", + "restart": "unless-stopped", + "ports": [ + "3004:3004/tcp" + ], + "volumes": [ + "./data/db:/data/db", + "./data/uploads:/data/uploads" + ], + "environment": { + "JWT_SECRET": "${GENERATED_JWT_SECRET}", + "DB_PATH": "/data/db/notetrace.db", + "UPLOADS_PATH": "/data/uploads" + } + } + } + ], + "top_level": {}, + "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": "notetrace-volume-0", + "service": "notetrace", + "container_path": "/data/db", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + }, + { + "id": "notetrace-volume-1", + "service": "notetrace", + "container_path": "/data/uploads", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "notetrace" + ], + "stop_order": [ + "notetrace" + ], + "dependency_readiness": "compose-healthcheck-then-port-or-process-fallback", + "rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes" + }, + "installer_inputs": { + "prompted": [ + "stack_name", + "base_vmid", + "rootfs_storage", + "persistent_data_destinations", + "frontend_bridge", + "frontend_ipv4_mode" + ], + "automatic": [ + "dependent_vmids", + "private_bridge", + "private_subnet", + "private_service_addresses", + "compose_service_aliases", + "generated_secrets", + "dependency_start_and_stop_order" + ], + "generated_secrets": [ + { + "id": "generated-notetrace-jwt-secret", + "strategy": "generate-cryptographically-random-at-install", + "bindings": [ + { + "service": "notetrace", + "environment_variable": "JWT_SECRET" + } + ] + } + ] + } + }, + "first_run": { + "endpoints": [ + { + "label": "NoteTrace", + "scheme": "http", + "port": 3004, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": { + "JWT_SECRET": { + "strategy": "token-hex", + "bytes": 48 + } + }, + "volume_preparations": [ + { + "container_path": "/data/db", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data/uploads", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 3004, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/curated/nutritrace.json b/oci/catalog/curated/nutritrace.json new file mode 100644 index 00000000..f1511e35 --- /dev/null +++ b/oci/catalog/curated/nutritrace.json @@ -0,0 +1,353 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-nutritrace", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "NutriTrace" + }, + "description": { + "en_US": "Self-hosted nutrition and meal tracker with food logging, recipes, and nutrition data." + }, + "category": "productivity", + "category_label": "Productivity & Workflows", + "author": "TraceApps", + "developer": "TraceApps", + "icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/nutritrace.webp", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 3001, + "path": "/" + }, + "website": "https://github.com/traceapps/nutritrace", + "documentation": "https://github.com/traceapps/nutritrace#readme", + "repository": "https://github.com/traceapps/nutritrace", + "tips": [ + "The first-run wizard can enable user management and create an administrator; single-user mode is also available." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "TraceApps", + "repository": "https://github.com/traceapps/nutritrace", + "default_branch": "main", + "revision": "888c9664cd3a0222a9449cff506264097a2ae9b2", + "image_repository_url": "https://github.com/orgs/traceapps/packages/container/package/nutritrace", + "readme_pushed_at": "", + "compose_sha256": "2a9bbfd67502e5fd7e7d09393abd510b2ac70f9d841cd4cca44b5364e3348d90", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/traceapps/nutritrace/main/README.md" + }, + "container_contract": { + "service_name": "nutritrace", + "container_name": "nutritrace", + "image": { + "reference": "ghcr.io/traceapps/nutritrace:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/traceapps/nutritrace", + "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": "upstream-documentation" + }, + { + "name": "DB_PATH", + "example": "/data/db/nutritrace.db", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + }, + { + "name": "UPLOADS_PATH", + "example": "/data/uploads", + "required": true, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/data/db", + "compose_source_example": "./data/db", + "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/uploads", + "compose_source_example": "./data/uploads", + "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": 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": "{\n \"name\": \"nutritrace\",\n \"services\": {\n \"nutritrace\": {\n \"image\": \"ghcr.io/traceapps/nutritrace:latest\",\n \"container_name\": \"nutritrace\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"3001:3001/tcp\"\n ],\n \"volumes\": [\n \"./data/db:/data/db\",\n \"./data/uploads:/data/uploads\"\n ],\n \"environment\": {\n \"JWT_SECRET\": \"${GENERATED_JWT_SECRET}\",\n \"DB_PATH\": \"/data/db/nutritrace.db\",\n \"UPLOADS_PATH\": \"/data/uploads\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "nutritrace", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "nutritrace", + "service_count": 1, + "services": [ + { + "name": "nutritrace", + "image": "ghcr.io/traceapps/nutritrace:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/traceapps/nutritrace:latest", + "container_name": "nutritrace", + "restart": "unless-stopped", + "ports": [ + "3001:3001/tcp" + ], + "volumes": [ + "./data/db:/data/db", + "./data/uploads:/data/uploads" + ], + "environment": { + "JWT_SECRET": "${GENERATED_JWT_SECRET}", + "DB_PATH": "/data/db/nutritrace.db", + "UPLOADS_PATH": "/data/uploads" + } + } + } + ], + "top_level": {}, + "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": "nutritrace-volume-0", + "service": "nutritrace", + "container_path": "/data/db", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + }, + { + "id": "nutritrace-volume-1", + "service": "nutritrace", + "container_path": "/data/uploads", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "nutritrace" + ], + "stop_order": [ + "nutritrace" + ], + "dependency_readiness": "compose-healthcheck-then-port-or-process-fallback", + "rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes" + }, + "installer_inputs": { + "prompted": [ + "stack_name", + "base_vmid", + "rootfs_storage", + "persistent_data_destinations", + "frontend_bridge", + "frontend_ipv4_mode" + ], + "automatic": [ + "dependent_vmids", + "private_bridge", + "private_subnet", + "private_service_addresses", + "compose_service_aliases", + "generated_secrets", + "dependency_start_and_stop_order" + ], + "generated_secrets": [ + { + "id": "generated-nutritrace-jwt-secret", + "strategy": "generate-cryptographically-random-at-install", + "bindings": [ + { + "service": "nutritrace", + "environment_variable": "JWT_SECRET" + } + ] + } + ] + } + }, + "first_run": { + "endpoints": [ + { + "label": "NutriTrace", + "scheme": "http", + "port": 3001, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": { + "JWT_SECRET": { + "strategy": "token-hex", + "bytes": 48 + } + }, + "volume_preparations": [ + { + "container_path": "/data/db", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data/uploads", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 3001, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/curated/opengist.json b/oci/catalog/curated/opengist.json new file mode 100644 index 00000000..a12aa18e --- /dev/null +++ b/oci/catalog/curated/opengist.json @@ -0,0 +1,285 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-opengist", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Opengist" + }, + "description": { + "en_US": "Self-hosted Git-powered pastebin for snippets with syntax highlighting, history, and optional Git-over-SSH access." + }, + "category": "documents", + "category_label": "Documents & Notes", + "author": "thomiceli", + "developer": "thomiceli", + "icon": "https://raw.githubusercontent.com/thomiceli/opengist/master/public/img/opengist.svg", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 6157, + "path": "/" + }, + "website": "https://opengist.io/", + "documentation": "https://opengist.io/docs", + "repository": "https://github.com/thomiceli/opengist", + "tips": [ + "The /opengist directory contains the SQLite database and Git-backed snippets.", + "Port 2222 provides Git-over-SSH; publish it only if you plan to use that feature." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "thomiceli", + "repository": "https://github.com/thomiceli/opengist", + "default_branch": "master", + "revision": "2acf3dae87f9c3d536e0a870787941bbd06d0b46", + "image_repository_url": "https://github.com/thomiceli/opengist/pkgs/container/opengist", + "readme_pushed_at": "", + "compose_sha256": "493ca309582a2dd17a31e7a7b12835830e7ee0b75c4faf20c21bfd9419a0ad30", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/thomiceli/opengist/master/README.md" + }, + "container_contract": { + "service_name": "opengist", + "container_name": "opengist", + "image": { + "reference": "ghcr.io/thomiceli/opengist:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/thomiceli/opengist", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [], + "volumes": [ + { + "id": "volume-0", + "container_path": "/opengist", + "compose_source_example": "./opengist-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": 6157, + "published_example": 6157, + "protocol": "tcp", + "required": true, + "proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat" + }, + { + "container_port": 2222, + "published_example": 2222, + "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 \"name\": \"opengist\",\n \"services\": {\n \"opengist\": {\n \"image\": \"ghcr.io/thomiceli/opengist:latest\",\n \"container_name\": \"opengist\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"6157:6157/tcp\",\n \"2222:2222/tcp\"\n ],\n \"volumes\": [\n \"./opengist-data:/opengist\"\n ]\n }\n }\n}" + }, + "compose_stack": { + "project_name": "opengist", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "opengist", + "service_count": 1, + "services": [ + { + "name": "opengist", + "image": "ghcr.io/thomiceli/opengist:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/thomiceli/opengist:latest", + "container_name": "opengist", + "restart": "unless-stopped", + "ports": [ + "6157:6157/tcp", + "2222:2222/tcp" + ], + "volumes": [ + "./opengist-data:/opengist" + ] + } + } + ], + "top_level": {}, + "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": "opengist-volume-0", + "service": "opengist", + "container_path": "/opengist", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "opengist" + ], + "stop_order": [ + "opengist" + ], + "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": "Opengist", + "scheme": "http", + "port": 6157, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [ + { + "container_path": "/opengist", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 6157, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/curated/opentask.json b/oci/catalog/curated/opentask.json new file mode 100644 index 00000000..b5cb0d93 --- /dev/null +++ b/oci/catalog/curated/opentask.json @@ -0,0 +1,276 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-opentask", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "OpenTask" + }, + "description": { + "en_US": "Self-hosted personal task manager with a Todoist-compatible workflow, search, and automatic account-registration lock." + }, + "category": "productivity", + "category_label": "Productivity & Workflows", + "author": "pranav-karra-3301", + "developer": "pranav-karra-3301", + "icon": "https://raw.githubusercontent.com/junkdrawerlab/opentask/main/assets/brand/icon.svg", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 7968, + "path": "/" + }, + "website": "https://github.com/junkdrawerlab/opentask", + "documentation": "https://github.com/junkdrawerlab/opentask#readme", + "repository": "https://github.com/pranav-karra-3301/opentask", + "tips": [ + "The first user registration is automatically treated as the administrator and locks new registration; HTTPS is needed for Web Push outside localhost." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "pranav-karra-3301", + "repository": "https://github.com/pranav-karra-3301/opentask", + "default_branch": "main", + "revision": "1214ee494d9692c39a733933a10ddc66af6a580f", + "image_repository_url": "https://github.com/orgs/pranav-karra-3301/packages/container/package/opentask", + "readme_pushed_at": "", + "compose_sha256": "f0f5b59f015c866295b7027420951dd8df66abb7296e0ccef47fdbd9bbeb7b09", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/pranav-karra-3301/opentask/main/README.md" + }, + "container_contract": { + "service_name": "opentask", + "container_name": "opentask", + "image": { + "reference": "ghcr.io/pranav-karra-3301/opentask:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/pranav-karra-3301/opentask", + "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", + "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": 7968, + "published_example": 7968, + "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 \"name\": \"opentask\",\n \"services\": {\n \"opentask\": {\n \"image\": \"ghcr.io/pranav-karra-3301/opentask:latest\",\n \"container_name\": \"opentask\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"7968:7968/tcp\"\n ],\n \"volumes\": [\n \"./data:/data\"\n ]\n }\n }\n}" + }, + "compose_stack": { + "project_name": "opentask", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "opentask", + "service_count": 1, + "services": [ + { + "name": "opentask", + "image": "ghcr.io/pranav-karra-3301/opentask:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/pranav-karra-3301/opentask:latest", + "container_name": "opentask", + "restart": "unless-stopped", + "ports": [ + "7968:7968/tcp" + ], + "volumes": [ + "./data:/data" + ] + } + } + ], + "top_level": {}, + "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": "opentask-volume-0", + "service": "opentask", + "container_path": "/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "opentask" + ], + "stop_order": [ + "opentask" + ], + "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": "OpenTask", + "scheme": "http", + "port": 7968, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 7968, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/curated/papra.json b/oci/catalog/curated/papra.json new file mode 100644 index 00000000..31e9a886 --- /dev/null +++ b/oci/catalog/curated/papra.json @@ -0,0 +1,302 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-papra", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Papra" + }, + "description": { + "en_US": "Self-hosted document management for storing, organizing, searching, and sharing personal documents." + }, + "category": "documents", + "category_label": "Documents & Notes", + "author": "papra-hq", + "developer": "papra-hq", + "icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/papra.webp", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 1221, + "path": "/" + }, + "website": "https://papra.app/", + "documentation": "https://docs.papra.app/self-hosting/using-docker/", + "repository": "https://github.com/papra-hq/papra", + "tips": [ + "The installer generates AUTH_SECRET. Keep /app/app-data backed up; it contains the database and documents." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "papra-hq", + "repository": "https://github.com/papra-hq/papra", + "default_branch": "main", + "revision": "93a569f3e90fd63a6034522d6c3b316d8bb67a65", + "image_repository_url": "https://github.com/orgs/papra-hq/packages/container/package/papra", + "readme_pushed_at": "", + "compose_sha256": "49e2b3120cd8d33b5d737a872bd2f695fb1bea63f155f9142ccc7860e93ede2e", + "generated_at": "2026-10-26T06:10:04+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/papra-hq/papra/main/README.md" + }, + "container_contract": { + "service_name": "papra", + "container_name": "papra", + "image": { + "reference": "ghcr.io/papra-hq/papra:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/papra-hq/papra", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "AUTH_SECRET", + "example": "${GENERATED_AUTH_SECRET}", + "required": true, + "sensitive": true, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/app/app-data", + "compose_source_example": "./papra-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": 1221, + "published_example": 1221, + "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 \"name\": \"papra\",\n \"services\": {\n \"papra\": {\n \"image\": \"ghcr.io/papra-hq/papra:latest\",\n \"container_name\": \"papra\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"1221:1221/tcp\"\n ],\n \"volumes\": [\n \"./papra-data:/app/app-data\"\n ],\n \"environment\": {\n \"AUTH_SECRET\": \"${GENERATED_AUTH_SECRET}\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "papra", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "papra", + "service_count": 1, + "services": [ + { + "name": "papra", + "image": "ghcr.io/papra-hq/papra:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/papra-hq/papra:latest", + "container_name": "papra", + "restart": "unless-stopped", + "ports": [ + "1221:1221/tcp" + ], + "volumes": [ + "./papra-data:/app/app-data" + ], + "environment": { + "AUTH_SECRET": "${GENERATED_AUTH_SECRET}" + } + } + } + ], + "top_level": {}, + "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": "papra-volume-0", + "service": "papra", + "container_path": "/app/app-data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "papra" + ], + "stop_order": [ + "papra" + ], + "dependency_readiness": "compose-healthcheck-then-port-or-process-fallback", + "rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes" + }, + "installer_inputs": { + "prompted": [ + "stack_name", + "base_vmid", + "rootfs_storage", + "persistent_data_destinations", + "frontend_bridge", + "frontend_ipv4_mode" + ], + "automatic": [ + "dependent_vmids", + "private_bridge", + "private_subnet", + "private_service_addresses", + "compose_service_aliases", + "generated_secrets", + "dependency_start_and_stop_order" + ], + "generated_secrets": [ + { + "id": "generated-papra-auth-secret", + "strategy": "generate-cryptographically-random-at-install", + "bindings": [ + { + "service": "papra", + "environment_variable": "AUTH_SECRET" + } + ] + } + ] + } + }, + "first_run": { + "endpoints": [ + { + "label": "Papra", + "scheme": "http", + "port": 1221, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": { + "AUTH_SECRET": { + "strategy": "token-hex", + "bytes": 48 + } + }, + "volume_preparations": [ + { + "container_path": "/app/app-data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 1221, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/curated/photofield.json b/oci/catalog/curated/photofield.json new file mode 100644 index 00000000..518c168d --- /dev/null +++ b/oci/catalog/curated/photofield.json @@ -0,0 +1,298 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-photofield", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Photofield" + }, + "description": { + "en_US": "Self-hosted photo library that indexes local photo collections and keeps its thumbnail cache in persistent storage." + }, + "category": "media", + "category_label": "Media & Streaming", + "author": "SmilyOrg", + "developer": "SmilyOrg", + "icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/photofield.webp", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 8080, + "path": "/" + }, + "website": "https://github.com/SmilyOrg/photofield", + "documentation": "https://github.com/SmilyOrg/photofield#readme", + "repository": "https://github.com/SmilyOrg/photofield", + "tips": [ + "Map a host photo directory at /app/photos for a real library; it is mounted read-only in the upstream example." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "SmilyOrg", + "repository": "https://github.com/SmilyOrg/photofield", + "default_branch": "main", + "revision": "d7374a9ab11be7d684e958b9bdf2b4205d0dbc23", + "image_repository_url": "https://github.com/orgs/SmilyOrg/packages/container/package/photofield", + "readme_pushed_at": "", + "compose_sha256": "9786bbfa8603a75fa42037397f14707c6f2d830edb2bc9844474590764ee5de4", + "generated_at": "2026-10-26T06:10:04+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/SmilyOrg/photofield/main/README.md" + }, + "container_contract": { + "service_name": "photofield", + "container_name": "photofield", + "image": { + "reference": "ghcr.io/smilyorg/photofield:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/smilyorg/photofield", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [], + "volumes": [ + { + "id": "volume-0", + "container_path": "/app/data", + "compose_source_example": "./data", + "read_only": false, + "required": true, + "installation_choice": [ + "managed-volume", + "host-bind" + ], + "default": "managed-volume", + "managed_volume": { + "backup": true, + "default_size_gb": 8 + } + }, + { + "id": "volume-1", + "container_path": "/app/photos", + "compose_source_example": "./photos", + "read_only": true, + "required": false, + "installation_choice": [ + "host-bind", + "skip" + ], + "default": "skip", + "managed_volume": { + "backup": false, + "default_size_gb": 1 + } + } + ], + "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": "{\n \"name\": \"photofield\",\n \"services\": {\n \"photofield\": {\n \"image\": \"ghcr.io/smilyorg/photofield:latest\",\n \"container_name\": \"photofield\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"8080:8080/tcp\"\n ],\n \"volumes\": [\n \"./data:/app/data\",\n \"./photos:/app/photos:ro\"\n ]\n }\n }\n}" + }, + "compose_stack": { + "project_name": "photofield", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "photofield", + "service_count": 1, + "services": [ + { + "name": "photofield", + "image": "ghcr.io/smilyorg/photofield:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/smilyorg/photofield:latest", + "container_name": "photofield", + "restart": "unless-stopped", + "ports": [ + "8080:8080/tcp" + ], + "volumes": [ + "./data:/app/data", + "./photos:/app/photos:ro" + ] + } + } + ], + "top_level": {}, + "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": "photofield-volume-0", + "service": "photofield", + "container_path": "/app/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "photofield" + ], + "stop_order": [ + "photofield" + ], + "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": "Photofield", + "scheme": "http", + "port": 8080, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [ + { + "container_path": "/app/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/app/photos", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 8080, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/curated/plants.json b/oci/catalog/curated/plants.json new file mode 100644 index 00000000..f5668d72 --- /dev/null +++ b/oci/catalog/curated/plants.json @@ -0,0 +1,285 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-plants", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Plants" + }, + "description": { + "en_US": "Self-hosted household plant-care tracker with reminders, photos, and multiple user accounts." + }, + "category": "productivity", + "category_label": "Productivity & Workflows", + "author": "dhrandy", + "developer": "dhrandy", + "icon": "https://raw.githubusercontent.com/dhrandy/plants/main/app/static/icon.svg", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64" + ], + "launch": { + "scheme": "http", + "port": 8000, + "path": "/" + }, + "website": "https://github.com/dhrandy/plants", + "documentation": "https://github.com/dhrandy/plants#readme", + "repository": "https://github.com/dhrandy/plants", + "tips": [ + "The first visit opens setup; the first account becomes the administrator." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "dhrandy", + "repository": "https://github.com/dhrandy/plants", + "default_branch": "main", + "revision": "e40a84a0fb9c1e9de491f9f69653034e561ac7fe", + "image_repository_url": "https://github.com/orgs/dhrandy/packages/container/package/plants", + "readme_pushed_at": "", + "compose_sha256": "25e903044cb5ef53f0b58ec9cab4ce88d47c4073bf69f8c6c836389cae46cd87", + "generated_at": "2026-10-26T06:10:04+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/dhrandy/plants/main/README.md" + }, + "container_contract": { + "service_name": "plants", + "container_name": "plants", + "image": { + "reference": "ghcr.io/dhrandy/plants:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/dhrandy/plants", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "TZ", + "example": "UTC", + "required": false, + "sensitive": false, + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/app/data", + "compose_source_example": "./data", + "read_only": false, + "required": true, + "installation_choice": [ + "managed-volume", + "host-bind" + ], + "default": "managed-volume", + "managed_volume": { + "backup": true, + "default_size_gb": 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": "{\n \"name\": \"plants\",\n \"services\": {\n \"plants\": {\n \"image\": \"ghcr.io/dhrandy/plants:latest\",\n \"container_name\": \"plants\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"8000:8000/tcp\"\n ],\n \"volumes\": [\n \"./data:/app/data\"\n ],\n \"environment\": {\n \"TZ\": \"UTC\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "plants", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "plants", + "service_count": 1, + "services": [ + { + "name": "plants", + "image": "ghcr.io/dhrandy/plants:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/dhrandy/plants:latest", + "container_name": "plants", + "restart": "unless-stopped", + "ports": [ + "8000:8000/tcp" + ], + "volumes": [ + "./data:/app/data" + ], + "environment": { + "TZ": "UTC" + } + } + } + ], + "top_level": {}, + "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": "plants-volume-0", + "service": "plants", + "container_path": "/app/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "plants" + ], + "stop_order": [ + "plants" + ], + "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": "Plants", + "scheme": "http", + "port": 8000, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [ + { + "container_path": "/app/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 8000, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/curated/sofa.json b/oci/catalog/curated/sofa.json new file mode 100644 index 00000000..b5c410a5 --- /dev/null +++ b/oci/catalog/curated/sofa.json @@ -0,0 +1,321 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-sofa", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Sofa" + }, + "description": { + "en_US": "Self-hosted movie and TV tracker with watch history, recommendations, and media-server integrations." + }, + "category": "media", + "category_label": "Media & Streaming", + "author": "jakejarvis", + "developer": "jakejarvis", + "icon": "https://raw.githubusercontent.com/jakejarvis/sofa/main/apps/web/public/icon.svg", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 3000, + "path": "/" + }, + "website": "https://github.com/jakejarvis/sofa", + "documentation": "https://github.com/jakejarvis/sofa#readme", + "repository": "https://github.com/jakejarvis/sofa", + "tips": [ + "A TMDB API Read Access Token is required for metadata and discovery. Update BETTER_AUTH_URL to the public HTTPS address when putting the app behind a reverse proxy.", + "The first account created becomes the administrator and registration then closes by default." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "jakejarvis", + "repository": "https://github.com/jakejarvis/sofa", + "default_branch": "main", + "revision": "a8294d977b0f2c0ad267d0b516298881a5571e86", + "image_repository_url": "https://github.com/orgs/jakejarvis/packages/container/package/sofa", + "readme_pushed_at": "", + "compose_sha256": "f58035702e2110cf26805bcb3c6a442296146ddd8dd36c1bf956469e94007471", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/jakejarvis/sofa/main/README.md" + }, + "container_contract": { + "service_name": "sofa", + "container_name": "sofa", + "image": { + "reference": "ghcr.io/jakejarvis/sofa:edge", + "registry": "ghcr.io", + "repository": "ghcr.io/jakejarvis/sofa", + "tag": "edge", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [ + { + "name": "TMDB_API_READ_ACCESS_TOKEN", + "example": null, + "required": true, + "sensitive": true, + "source": "upstream-documentation" + }, + { + "name": "BETTER_AUTH_SECRET", + "example": "${GENERATED_BETTER_AUTH_SECRET}", + "required": true, + "sensitive": true, + "source": "upstream-documentation" + }, + { + "name": "BETTER_AUTH_URL", + "example": "http://@CONTAINER_ADDRESS@:3000", + "required": true, + "sensitive": false, + "container_address": "http://@CONTAINER_ADDRESS@:3000", + "source": "upstream-documentation" + } + ], + "volumes": [ + { + "id": "volume-0", + "container_path": "/data", + "compose_source_example": "./data", + "read_only": false, + "required": true, + "installation_choice": [ + "managed-volume", + "host-bind" + ], + "default": "managed-volume", + "managed_volume": { + "backup": true, + "default_size_gb": 8 + } + } + ], + "ports": [ + { + "container_port": 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": "{\n \"name\": \"sofa\",\n \"services\": {\n \"sofa\": {\n \"image\": \"ghcr.io/jakejarvis/sofa:edge\",\n \"container_name\": \"sofa\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"3000:3000/tcp\"\n ],\n \"volumes\": [\n \"./data:/data\"\n ],\n \"environment\": {\n \"TMDB_API_READ_ACCESS_TOKEN\": null,\n \"BETTER_AUTH_SECRET\": \"${GENERATED_BETTER_AUTH_SECRET}\",\n \"BETTER_AUTH_URL\": \"http://@CONTAINER_ADDRESS@:3000\"\n }\n }\n }\n}" + }, + "compose_stack": { + "project_name": "sofa", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "sofa", + "service_count": 1, + "services": [ + { + "name": "sofa", + "image": "ghcr.io/jakejarvis/sofa:edge", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/jakejarvis/sofa:edge", + "container_name": "sofa", + "restart": "unless-stopped", + "ports": [ + "3000:3000/tcp" + ], + "volumes": [ + "./data:/data" + ], + "environment": { + "TMDB_API_READ_ACCESS_TOKEN": null, + "BETTER_AUTH_SECRET": "${GENERATED_BETTER_AUTH_SECRET}", + "BETTER_AUTH_URL": "http://@CONTAINER_ADDRESS@:3000" + } + } + } + ], + "top_level": {}, + "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": "sofa-volume-0", + "service": "sofa", + "container_path": "/data", + "mode": "managed-volume", + "user_selectable": true, + "backup": true, + "shared_with_other_lxc": false, + "source_path": null, + "source_path_prompt": null + } + ], + "orchestration": { + "reserve_vmids_atomically": 1, + "start_order": [ + "sofa" + ], + "stop_order": [ + "sofa" + ], + "dependency_readiness": "compose-healthcheck-then-port-or-process-fallback", + "rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes" + }, + "installer_inputs": { + "prompted": [ + "stack_name", + "base_vmid", + "rootfs_storage", + "persistent_data_destinations", + "frontend_bridge", + "frontend_ipv4_mode" + ], + "automatic": [ + "dependent_vmids", + "private_bridge", + "private_subnet", + "private_service_addresses", + "compose_service_aliases", + "generated_secrets", + "dependency_start_and_stop_order" + ], + "generated_secrets": [ + { + "id": "generated-sofa-better-auth-secret", + "strategy": "generate-cryptographically-random-at-install", + "bindings": [ + { + "service": "sofa", + "environment_variable": "BETTER_AUTH_SECRET" + } + ] + } + ] + } + }, + "first_run": { + "endpoints": [ + { + "label": "Sofa", + "scheme": "http", + "port": 3000, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": { + "BETTER_AUTH_SECRET": { + "strategy": "token-hex", + "bytes": 32 + } + }, + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-application-user", + "only_when_mount_type": "managed-volume" + } + ], + "startup_healthcheck": { + "scheme": "http", + "port": 3000, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/curated/web-check.json b/oci/catalog/curated/web-check.json new file mode 100644 index 00000000..2db02d7b --- /dev/null +++ b/oci/catalog/curated/web-check.json @@ -0,0 +1,238 @@ +{ + "schema_version": "0.5.0", + "kind": "proxmenux.oci-template", + "id": "image-web-check", + "status": "generated-unvalidated", + "catalog_ui": { + "title": { + "en_US": "Web Check" + }, + "description": { + "en_US": "Self-hosted website diagnostics for checking DNS, TLS certificates, HTTP headers, and other web properties." + }, + "category": "tools", + "category_label": "Tools", + "author": "Lissy93", + "developer": "Lissy93", + "icon": "https://raw.githubusercontent.com/Lissy93/web-check/master/public/favicon.svg", + "thumbnail": null, + "screenshots": [], + "architectures": [ + "amd64", + "arm64" + ], + "launch": { + "scheme": "http", + "port": 3000, + "path": "/" + }, + "website": "https://web-check.xyz/", + "documentation": "https://github.com/Lissy93/web-check#readme", + "repository": "https://github.com/Lissy93/web-check", + "tips": [ + "No authentication is built in. Restrict access to trusted users and avoid exposing the service publicly; submitted checks can target private network addresses." + ], + "mini_changelog": [], + "display_version": null, + "updated_at": null + }, + "source": { + "provider": "Lissy93", + "repository": "https://github.com/Lissy93/web-check", + "default_branch": "master", + "revision": "d4be4895c94270c3b8d5a2be544298e3b1b7ee39", + "image_repository_url": "https://github.com/orgs/Lissy93/packages/container/package/web-check", + "readme_pushed_at": "", + "compose_sha256": "273607094e2cec1c15d64d9a672c89aa033ad109acf1580c47f4fa52ca3ea019", + "generated_at": "2026-10-26T06:12:09+00:00", + "readme_raw_url": "https://raw.githubusercontent.com/Lissy93/web-check/master/README.md" + }, + "container_contract": { + "service_name": "web-check", + "container_name": "web-check", + "image": { + "reference": "ghcr.io/lissy93/web-check:latest", + "registry": "ghcr.io", + "repository": "ghcr.io/lissy93/web-check", + "tag": "latest", + "digest": null, + "pull_policy": "resolve-selected-tag-to-architecture-digest-at-install" + }, + "environment": [], + "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": "{\n \"name\": \"web-check\",\n \"services\": {\n \"web-check\": {\n \"image\": \"ghcr.io/lissy93/web-check:latest\",\n \"container_name\": \"web-check\",\n \"restart\": \"unless-stopped\",\n \"ports\": [\n \"3000:3000/tcp\"\n ],\n \"volumes\": []\n }\n }\n}" + }, + "compose_stack": { + "project_name": "web-check", + "deployment_model": "one-native-oci-lxc-per-compose-service", + "user_experience": "single-application-install", + "main_service": "web-check", + "service_count": 1, + "services": [ + { + "name": "web-check", + "image": "ghcr.io/lissy93/web-check:latest", + "is_main": true, + "role": "frontend", + "vmid_offset": 0, + "depends_on": [], + "frontend_network": true, + "private_network": false, + "compose": { + "image": "ghcr.io/lissy93/web-check:latest", + "container_name": "web-check", + "restart": "unless-stopped", + "ports": [ + "3000:3000/tcp" + ], + "volumes": [] + } + } + ], + "top_level": {}, + "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": [ + "web-check" + ], + "stop_order": [ + "web-check" + ], + "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 Check", + "scheme": "http", + "port": 3000, + "path": "/", + "source": "upstream-documentation" + } + ], + "credentials": [] + }, + "proxmox": { + "runtime": "native-oci-lxc", + "technology_status": "proxmox-technology-preview", + "defaults": { + "unprivileged": true, + "ostype": "auto-from-image", + "cores": 2, + "memory_mb": 1024, + "swap_mb": 512, + "rootfs_size_gb": 8, + "rootfs_storage": "local-lvm", + "volume_storage": "local-lvm", + "template_storage": "local", + "bridge": "vmbr0", + "ipv4": "dhcp", + "firewall": true, + "host_managed_network": true, + "onboot": false, + "features": [ + "nesting=1" + ], + "shutdown_timeout_seconds": 120 + }, + "image_metadata_policy": { + "entrypoint": "import-from-oci-image", + "cmd": "import-from-oci-image", + "environment": "import-image-env-then-apply-compose-overrides", + "user": "import-from-oci-image", + "working_dir": "import-from-oci-image", + "stop_signal": "import-from-oci-image" + }, + "installer_profile": { + "generated_sensitive_environment": {}, + "volume_preparations": [], + "startup_healthcheck": { + "scheme": "http", + "port": 3000, + "path": "/", + "timeout_seconds": 180, + "request_timeout_seconds": 10, + "stability_seconds": 4, + "verify_tls": true + } + } + }, + "compatibility": { + "automatic_install_candidate": true, + "validated": false, + "supported_compose_keys": [ + "image", + "container_name", + "environment", + "ports", + "restart", + "volumes", + "user" + ], + "untranslated_blockers": [], + "policy": "Single OCI image and one application service. Persistent paths, required settings, listeners and upstream first-run steps are recorded; runtime installation and service behavior remain unvalidated until laboratory testing." + }, + "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 + } +} diff --git a/oci/catalog/index.json b/oci/catalog/index.json index b8246f99..4ff8ad7d 100644 --- a/oci/catalog/index.json +++ b/oci/catalog/index.json @@ -2,7 +2,7 @@ "schema_version": "0.2.0", "kind": "proxmenux.oci-catalog-index", "provider": "multiple-container-images", - "generated_at": "2026-09-13T21:11:40+00:00", + "generated_at": "2026-10-26T08:04:51+00:00", "applications": [ { "id": "2fauth", @@ -622,6 +622,38 @@ "hidden": false, "template_id": "linuxserver-ardour" }, + { + "id": "artalk", + "provider": "ArtalkJS", + "template_family": "curated-profile", + "title": "Artalk", + "repository": "https://github.com/ArtalkJS/Artalk", + "description": "Self-hosted comment server for blogs and websites, with a browser-based dashboard.", + "website": "https://artalk.js.org/", + "icon": "https://raw.githubusercontent.com/ArtalkJS/Artalk/master/docs/docs/images/artalk-logo.png", + "architectures": [ + "amd64", + "arm64" + ], + "updated_at": null, + "main_image": "docker.io/artalk/artalk-go:latest", + "category": "documents", + "category_label": "Documents & Notes", + "replaces_discovered_ids": [], + "curated_path": "catalog/curated/artalk.json", + "template": "apps/artalk.json", + "template_status": "generated-unvalidated", + "automatic_install_candidate": true, + "untranslated_blockers": [], + "requires_privileged_lxc": false, + "optional_privileged_lxc": false, + "requires_host_pid_namespace": false, + "requires_relaxed_confinement": false, + "optional_relaxed_confinement": false, + "requires_security_confirmation": false, + "hidden": false, + "template_id": "image-artalk" + }, { "id": "audacity", "provider": "linuxserver.io", @@ -1020,6 +1052,38 @@ "hidden": false, "template_id": "image-beszel" }, + { + "id": "bichon", + "provider": "rustmailer", + "template_family": "curated-profile", + "title": "Bichon", + "repository": "https://github.com/rustmailer/bichon", + "description": "Self-hosted email archival and search server that downloads mailboxes over IMAP into encrypted local storage.", + "website": "https://github.com/rustmailer/bichon", + "icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/bichon.webp", + "architectures": [ + "amd64", + "arm64" + ], + "updated_at": null, + "main_image": "docker.io/rustmailer/bichon:latest", + "category": "communication", + "category_label": "Communication & Community", + "replaces_discovered_ids": [], + "curated_path": "catalog/curated/bichon.json", + "template": "apps/bichon.json", + "template_status": "generated-unvalidated", + "automatic_install_candidate": true, + "untranslated_blockers": [], + "requires_privileged_lxc": false, + "optional_privileged_lxc": false, + "requires_host_pid_namespace": false, + "requires_relaxed_confinement": false, + "optional_relaxed_confinement": false, + "requires_security_confirmation": false, + "hidden": false, + "template_id": "image-bichon" + }, { "id": "bitcoin-knots", "provider": "linuxserver.io", @@ -1472,6 +1536,38 @@ "hidden": false, "template_id": "linuxserver-calligra" }, + { + "id": "calnode", + "provider": "Calnode", + "template_family": "curated-profile", + "title": "Calnode", + "repository": "https://github.com/Calnode/calnode", + "description": "Self-hosted scheduling and booking app with a built-in admin interface and SQLite database.", + "website": "https://github.com/Calnode/calnode", + "icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/calnode.webp", + "architectures": [ + "amd64", + "arm64" + ], + "updated_at": null, + "main_image": "ghcr.io/calnode/calnode:latest", + "category": "productivity", + "category_label": "Productivity & Workflows", + "replaces_discovered_ids": [], + "curated_path": "catalog/curated/calnode.json", + "template": "apps/calnode.json", + "template_status": "generated-unvalidated", + "automatic_install_candidate": true, + "untranslated_blockers": [], + "requires_privileged_lxc": false, + "optional_privileged_lxc": false, + "requires_host_pid_namespace": false, + "requires_relaxed_confinement": false, + "optional_relaxed_confinement": false, + "requires_security_confirmation": false, + "hidden": false, + "template_id": "image-calnode" + }, { "id": "changedetection.io", "provider": "linuxserver.io", @@ -1982,6 +2078,38 @@ "hidden": false, "template_id": "image-convertx" }, + { + "id": "cooktrace", + "provider": "TraceApps", + "template_family": "curated-profile", + "title": "CookTrace", + "repository": "https://github.com/traceapps/cooktrace", + "description": "Self-hosted recipe manager for collecting, organizing, and sharing recipes.", + "website": "https://github.com/traceapps/cooktrace", + "icon": "https://raw.githubusercontent.com/traceapps/cooktrace/main/public/icons/icon-512.png", + "architectures": [ + "amd64", + "arm64" + ], + "updated_at": null, + "main_image": "ghcr.io/traceapps/cooktrace:latest", + "category": "productivity", + "category_label": "Productivity & Workflows", + "replaces_discovered_ids": [], + "curated_path": "catalog/curated/cooktrace.json", + "template": "apps/cooktrace.json", + "template_status": "generated-unvalidated", + "automatic_install_candidate": true, + "untranslated_blockers": [], + "requires_privileged_lxc": false, + "optional_privileged_lxc": false, + "requires_host_pid_namespace": false, + "requires_relaxed_confinement": false, + "optional_relaxed_confinement": false, + "requires_security_confirmation": false, + "hidden": false, + "template_id": "image-cooktrace" + }, { "id": "cops", "provider": "linuxserver.io", @@ -2521,6 +2649,37 @@ "hidden": true, "template_id": "image-deepseek-ocr-nvidia" }, + { + "id": "degubase", + "provider": "saintedlama", + "template_family": "curated-profile", + "title": "Degubase", + "repository": "https://github.com/saintedlama/degubase", + "description": "A single-container web interface for building small relational workspaces backed by SQLite.", + "website": "https://github.com/saintedlama/degubase", + "icon": "https://raw.githubusercontent.com/saintedlama/degubase/main/ui/public/assets/logo.svg", + "architectures": [ + "amd64" + ], + "updated_at": null, + "main_image": "ghcr.io/saintedlama/degubase:latest", + "category": "databases", + "category_label": "Databases", + "replaces_discovered_ids": [], + "curated_path": "catalog/curated/degubase.json", + "template": "apps/degubase.json", + "template_status": "generated-unvalidated", + "automatic_install_candidate": true, + "untranslated_blockers": [], + "requires_privileged_lxc": false, + "optional_privileged_lxc": false, + "requires_host_pid_namespace": false, + "requires_relaxed_confinement": false, + "optional_relaxed_confinement": false, + "requires_security_confirmation": false, + "hidden": false, + "template_id": "image-degubase" + }, { "id": "deluge", "provider": "linuxserver.io", @@ -4186,6 +4345,38 @@ "hidden": false, "template_id": "linuxserver-firefox" }, + { + "id": "flagr", + "provider": "openflagr", + "template_family": "curated-profile", + "title": "Flagr", + "repository": "https://github.com/openflagr/flagr", + "description": "Self-hosted feature-flag and experimentation service with a web interface and SQLite defaults.", + "website": "https://github.com/openflagr/flagr", + "icon": "https://raw.githubusercontent.com/openflagr/flagr/main/docs/brand/flagr-mark.png", + "architectures": [ + "amd64", + "arm64" + ], + "updated_at": null, + "main_image": "ghcr.io/openflagr/flagr:latest", + "category": "ai", + "category_label": "AI / Coding & Dev-Tools", + "replaces_discovered_ids": [], + "curated_path": "catalog/curated/flagr.json", + "template": "apps/flagr.json", + "template_status": "generated-unvalidated", + "automatic_install_candidate": true, + "untranslated_blockers": [], + "requires_privileged_lxc": false, + "optional_privileged_lxc": false, + "requires_host_pid_namespace": false, + "requires_relaxed_confinement": false, + "optional_relaxed_confinement": false, + "requires_security_confirmation": false, + "hidden": false, + "template_id": "image-flagr" + }, { "id": "flame", "provider": "pawelmalak", @@ -5248,6 +5439,38 @@ "hidden": false, "template_id": "linuxserver-grocy" }, + { + "id": "guestroll", + "provider": "achedon12", + "template_family": "curated-profile", + "title": "Guestroll", + "repository": "https://github.com/achedon12/guestroll", + "description": "Self-hosted event photo gallery for guests, with moderation, QR-code sharing, and local SQLite storage.", + "website": "https://github.com/achedon12/guestroll", + "icon": "https://raw.githubusercontent.com/achedon12/guestroll/develop/src/app/icon.svg", + "architectures": [ + "amd64", + "arm64" + ], + "updated_at": null, + "main_image": "ghcr.io/achedon12/guestroll:latest", + "category": "sharing", + "category_label": "Files & Sharing", + "replaces_discovered_ids": [], + "curated_path": "catalog/curated/guestroll.json", + "template": "apps/guestroll.json", + "template_status": "generated-unvalidated", + "automatic_install_candidate": true, + "untranslated_blockers": [], + "requires_privileged_lxc": false, + "optional_privileged_lxc": false, + "requires_host_pid_namespace": false, + "requires_relaxed_confinement": false, + "optional_relaxed_confinement": false, + "requires_security_confirmation": false, + "hidden": false, + "template_id": "image-guestroll" + }, { "id": "gzdoom", "provider": "linuxserver.io", @@ -6040,6 +6263,70 @@ "multi_container": false, "template_id": "image-icecast" }, + { + "id": "ihatemoney", + "provider": "spiral-project", + "template_family": "curated-profile", + "title": "I Hate Money", + "repository": "https://github.com/spiral-project/ihatemoney", + "description": "Self-hosted shared-expense and group-budget manager for tracking purchases and settling who owes whom.", + "website": "https://ihatemoney.org/", + "icon": "https://raw.githubusercontent.com/spiral-project/ihatemoney/main/ihatemoney/static/favicon.ico", + "architectures": [ + "amd64", + "arm64" + ], + "updated_at": null, + "main_image": "docker.io/ihatemoney/ihatemoney:latest", + "category": "finance", + "category_label": "Finance & Budgeting", + "replaces_discovered_ids": [], + "curated_path": "catalog/curated/ihatemoney.json", + "template": "apps/ihatemoney.json", + "template_status": "generated-unvalidated", + "automatic_install_candidate": true, + "untranslated_blockers": [], + "requires_privileged_lxc": false, + "optional_privileged_lxc": false, + "requires_host_pid_namespace": false, + "requires_relaxed_confinement": false, + "optional_relaxed_confinement": false, + "requires_security_confirmation": false, + "hidden": false, + "template_id": "image-ihatemoney" + }, + { + "id": "imagesilo", + "provider": "Willxup", + "template_family": "curated-profile", + "title": "ImageSilo", + "repository": "https://github.com/Willxup/imagesilo", + "description": "Self-hosted image-hosting service with authenticated uploads, image processing, public links, and local storage.", + "website": "https://github.com/Willxup/imagesilo", + "icon": "https://raw.githubusercontent.com/Willxup/imagesilo/main/assets/brand/imagesilo-icon-512.png", + "architectures": [ + "amd64", + "arm64" + ], + "updated_at": null, + "main_image": "ghcr.io/willxup/imagesilo:latest", + "category": "sharing", + "category_label": "Files & Sharing", + "replaces_discovered_ids": [], + "curated_path": "catalog/curated/imagesilo.json", + "template": "apps/imagesilo.json", + "template_status": "generated-unvalidated", + "automatic_install_candidate": true, + "untranslated_blockers": [], + "requires_privileged_lxc": false, + "optional_privileged_lxc": false, + "requires_host_pid_namespace": false, + "requires_relaxed_confinement": false, + "optional_relaxed_confinement": false, + "requires_security_confirmation": false, + "hidden": false, + "template_id": "image-imagesilo" + }, { "id": "immich", "provider": "immich", @@ -6173,6 +6460,37 @@ "hidden": false, "template_id": "linuxserver-inkscape" }, + { + "id": "instatic", + "provider": "CoreBunch", + "template_family": "curated-profile", + "title": "Instatic", + "repository": "https://github.com/CoreBunch/Instatic", + "description": "Single-server website CMS and visual editor with SQLite-backed content, media uploads, forms, and publishing.", + "website": "https://github.com/CoreBunch/Instatic", + "icon": "https://raw.githubusercontent.com/CoreBunch/Instatic/main/public/favicon.svg", + "architectures": [ + "amd64" + ], + "updated_at": null, + "main_image": "ghcr.io/corebunch/instatic:latest", + "category": "web", + "category_label": "Webservers & Proxies", + "replaces_discovered_ids": [], + "curated_path": "catalog/curated/instatic.json", + "template": "apps/instatic.json", + "template_status": "generated-unvalidated", + "automatic_install_candidate": true, + "untranslated_blockers": [], + "requires_privileged_lxc": false, + "optional_privileged_lxc": false, + "requires_host_pid_namespace": false, + "requires_relaxed_confinement": false, + "optional_relaxed_confinement": false, + "requires_security_confirmation": false, + "hidden": false, + "template_id": "image-instatic" + }, { "id": "intellij-idea", "provider": "linuxserver.io", @@ -6204,6 +6522,38 @@ "hidden": false, "template_id": "linuxserver-intellij-idea" }, + { + "id": "invoiceshelf", + "provider": "InvoiceShelf", + "template_family": "curated-profile", + "title": "InvoiceShelf", + "repository": "https://github.com/InvoiceShelf/InvoiceShelf", + "description": "Self-hosted invoicing and estimates with customer portals, recurring billing, payments, and expense tracking.", + "website": "https://github.com/InvoiceShelf/InvoiceShelf", + "icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/invoiceshelf.webp", + "architectures": [ + "amd64", + "arm64" + ], + "updated_at": null, + "main_image": "docker.io/invoiceshelf/invoiceshelf:latest", + "category": "business", + "category_label": "Business & ERP", + "replaces_discovered_ids": [], + "curated_path": "catalog/curated/invoiceshelf.json", + "template": "apps/invoiceshelf.json", + "template_status": "generated-unvalidated", + "automatic_install_candidate": true, + "untranslated_blockers": [], + "requires_privileged_lxc": false, + "optional_privileged_lxc": false, + "requires_host_pid_namespace": false, + "requires_relaxed_confinement": false, + "optional_relaxed_confinement": false, + "requires_security_confirmation": false, + "hidden": false, + "template_id": "image-invoiceshelf" + }, { "id": "iobroker", "provider": "ioBroker Community", @@ -7021,6 +7371,38 @@ "hidden": false, "template_id": "linuxserver-krita" }, + { + "id": "kroma", + "provider": "kromatv", + "template_family": "curated-profile", + "title": "KROMA", + "repository": "https://github.com/kromatv/kroma", + "description": "Personal media server for browsing and playing a local video library, with direct play and optional modules.", + "website": "https://github.com/kromatv/kroma", + "icon": "https://raw.githubusercontent.com/kromatv/kroma/main/.github/assets/logo.svg", + "architectures": [ + "amd64", + "arm64" + ], + "updated_at": null, + "main_image": "ghcr.io/kromatv/kroma:latest", + "category": "media", + "category_label": "Media & Streaming", + "replaces_discovered_ids": [], + "curated_path": "catalog/curated/kroma.json", + "template": "apps/kroma.json", + "template_status": "generated-unvalidated", + "automatic_install_candidate": true, + "untranslated_blockers": [], + "requires_privileged_lxc": false, + "optional_privileged_lxc": false, + "requires_host_pid_namespace": false, + "requires_relaxed_confinement": false, + "optional_relaxed_confinement": false, + "requires_security_confirmation": false, + "hidden": false, + "template_id": "image-kroma" + }, { "id": "label-studio", "source_app_id": "label-studio", @@ -7156,6 +7538,38 @@ "hidden": false, "template_id": "linuxserver-ldap-auth" }, + { + "id": "libre-closet", + "provider": "lazztech", + "template_family": "curated-profile", + "title": "Libre Closet", + "repository": "https://github.com/lazztech/Libre-Closet", + "description": "Self-hosted wardrobe catalog for organizing clothing, outfits, and personal style with SQLite and local file storage.", + "website": "https://github.com/lazztech/Libre-Closet", + "icon": "https://raw.githubusercontent.com/lazztech/Libre-Closet/main/public/favicon.ico", + "architectures": [ + "amd64", + "arm64" + ], + "updated_at": null, + "main_image": "ghcr.io/lazztech/libre-closet:latest", + "category": "productivity", + "category_label": "Productivity & Workflows", + "replaces_discovered_ids": [], + "curated_path": "catalog/curated/libre-closet.json", + "template": "apps/libre-closet.json", + "template_status": "generated-unvalidated", + "automatic_install_candidate": true, + "untranslated_blockers": [], + "requires_privileged_lxc": false, + "optional_privileged_lxc": false, + "requires_host_pid_namespace": false, + "requires_relaxed_confinement": false, + "optional_relaxed_confinement": false, + "requires_security_confirmation": false, + "hidden": false, + "template_id": "image-libre-closet" + }, { "id": "librechat", "source_app_id": "librechat", @@ -7392,6 +7806,38 @@ "hidden": false, "template_id": "linuxserver-lidarr" }, + { + "id": "lifttrace", + "provider": "TraceApps", + "template_family": "curated-profile", + "title": "LiftTrace", + "repository": "https://github.com/traceapps/lifttrace", + "description": "Self-hosted strength-training tracker with workout logs, programs, progress photos, and a mobile PWA.", + "website": "https://github.com/traceapps/lifttrace", + "icon": "https://raw.githubusercontent.com/traceapps/lifttrace/main/public/icons/icon-512.png", + "architectures": [ + "amd64", + "arm64" + ], + "updated_at": null, + "main_image": "ghcr.io/traceapps/lifttrace:latest", + "category": "productivity", + "category_label": "Productivity & Workflows", + "replaces_discovered_ids": [], + "curated_path": "catalog/curated/lifttrace.json", + "template": "apps/lifttrace.json", + "template_status": "generated-unvalidated", + "automatic_install_candidate": true, + "untranslated_blockers": [], + "requires_privileged_lxc": false, + "optional_privileged_lxc": false, + "requires_host_pid_namespace": false, + "requires_relaxed_confinement": false, + "optional_relaxed_confinement": false, + "requires_security_confirmation": false, + "hidden": false, + "template_id": "image-lifttrace" + }, { "id": "limnoria", "provider": "linuxserver.io", @@ -7957,6 +8403,38 @@ "hidden": false, "template_id": "image-mailpit" }, + { + "id": "maintainerr", + "provider": "Maintainerr", + "template_family": "curated-profile", + "title": "Maintainerr", + "repository": "https://github.com/Maintainerr/Maintainerr", + "description": "Self-hosted media-library cleanup and maintenance dashboard for Plex, Jellyfin, or Emby.", + "website": "https://github.com/Maintainerr/Maintainerr", + "icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/maintainerr.webp", + "architectures": [ + "amd64", + "arm64" + ], + "updated_at": null, + "main_image": "ghcr.io/maintainerr/maintainerr:latest", + "category": "media", + "category_label": "Media & Streaming", + "replaces_discovered_ids": [], + "curated_path": "catalog/curated/maintainerr.json", + "template": "apps/maintainerr.json", + "template_status": "generated-unvalidated", + "automatic_install_candidate": true, + "untranslated_blockers": [], + "requires_privileged_lxc": false, + "optional_privileged_lxc": false, + "requires_host_pid_namespace": false, + "requires_relaxed_confinement": false, + "optional_relaxed_confinement": false, + "requires_security_confirmation": false, + "hidden": false, + "template_id": "image-maintainerr" + }, { "id": "makemkv", "provider": "jlesage", @@ -9601,6 +10079,70 @@ "hidden": false, "template_id": "image-node-red" }, + { + "id": "notara", + "provider": "DnzzL", + "template_family": "curated-profile", + "title": "Notara", + "repository": "https://github.com/DnzzL/notara", + "description": "Self-hosted collaborative notes and knowledge base with pages, inline databases, and SQLite storage.", + "website": "https://github.com/DnzzL/notara", + "icon": "https://raw.githubusercontent.com/DnzzL/notara/main/packages/app/public/icon-512.svg", + "architectures": [ + "amd64", + "arm64" + ], + "updated_at": null, + "main_image": "ghcr.io/dnzzl/notara:latest", + "category": "documents", + "category_label": "Documents & Notes", + "replaces_discovered_ids": [], + "curated_path": "catalog/curated/notara.json", + "template": "apps/notara.json", + "template_status": "generated-unvalidated", + "automatic_install_candidate": true, + "untranslated_blockers": [], + "requires_privileged_lxc": false, + "optional_privileged_lxc": false, + "requires_host_pid_namespace": false, + "requires_relaxed_confinement": false, + "optional_relaxed_confinement": false, + "requires_security_confirmation": false, + "hidden": false, + "template_id": "image-notara" + }, + { + "id": "notetrace", + "provider": "TraceApps", + "template_family": "curated-profile", + "title": "NoteTrace", + "repository": "https://github.com/traceapps/notetrace", + "description": "Self-hosted notes and notebooks with attachments, backups, and optional multi-user accounts.", + "website": "https://github.com/traceapps/notetrace", + "icon": "https://raw.githubusercontent.com/traceapps/notetrace/main/public/icons/icon-512.png", + "architectures": [ + "amd64", + "arm64" + ], + "updated_at": null, + "main_image": "ghcr.io/traceapps/notetrace:latest", + "category": "documents", + "category_label": "Documents & Notes", + "replaces_discovered_ids": [], + "curated_path": "catalog/curated/notetrace.json", + "template": "apps/notetrace.json", + "template_status": "generated-unvalidated", + "automatic_install_candidate": true, + "untranslated_blockers": [], + "requires_privileged_lxc": false, + "optional_privileged_lxc": false, + "requires_host_pid_namespace": false, + "requires_relaxed_confinement": false, + "optional_relaxed_confinement": false, + "requires_security_confirmation": false, + "hidden": false, + "template_id": "image-notetrace" + }, { "id": "ntfy", "provider": "binwiederhier", @@ -9664,6 +10206,38 @@ "hidden": false, "template_id": "image-nut-server" }, + { + "id": "nutritrace", + "provider": "TraceApps", + "template_family": "curated-profile", + "title": "NutriTrace", + "repository": "https://github.com/traceapps/nutritrace", + "description": "Self-hosted nutrition and meal tracker with food logging, recipes, and nutrition data.", + "website": "https://github.com/traceapps/nutritrace", + "icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/nutritrace.webp", + "architectures": [ + "amd64", + "arm64" + ], + "updated_at": null, + "main_image": "ghcr.io/traceapps/nutritrace:latest", + "category": "productivity", + "category_label": "Productivity & Workflows", + "replaces_discovered_ids": [], + "curated_path": "catalog/curated/nutritrace.json", + "template": "apps/nutritrace.json", + "template_status": "generated-unvalidated", + "automatic_install_candidate": true, + "untranslated_blockers": [], + "requires_privileged_lxc": false, + "optional_privileged_lxc": false, + "requires_host_pid_namespace": false, + "requires_relaxed_confinement": false, + "optional_relaxed_confinement": false, + "requires_security_confirmation": false, + "hidden": false, + "template_id": "image-nutritrace" + }, { "id": "nzbfast", "source_app_id": "nzbfast", @@ -10124,6 +10698,38 @@ "hidden": false, "template_id": "image-openclaw" }, + { + "id": "opengist", + "provider": "thomiceli", + "template_family": "curated-profile", + "title": "Opengist", + "repository": "https://github.com/thomiceli/opengist", + "description": "Self-hosted Git-powered pastebin for snippets with syntax highlighting, history, and optional Git-over-SSH access.", + "website": "https://opengist.io/", + "icon": "https://raw.githubusercontent.com/thomiceli/opengist/master/public/img/opengist.svg", + "architectures": [ + "amd64", + "arm64" + ], + "updated_at": null, + "main_image": "ghcr.io/thomiceli/opengist:latest", + "category": "documents", + "category_label": "Documents & Notes", + "replaces_discovered_ids": [], + "curated_path": "catalog/curated/opengist.json", + "template": "apps/opengist.json", + "template_status": "generated-unvalidated", + "automatic_install_candidate": true, + "untranslated_blockers": [], + "requires_privileged_lxc": false, + "optional_privileged_lxc": false, + "requires_host_pid_namespace": false, + "requires_relaxed_confinement": false, + "optional_relaxed_confinement": false, + "requires_security_confirmation": false, + "hidden": false, + "template_id": "image-opengist" + }, { "id": "openhab", "source_app_id": "openhab", @@ -10362,6 +10968,38 @@ "hidden": false, "template_id": "linuxserver-openssh-server" }, + { + "id": "opentask", + "provider": "pranav-karra-3301", + "template_family": "curated-profile", + "title": "OpenTask", + "repository": "https://github.com/pranav-karra-3301/opentask", + "description": "Self-hosted personal task manager with a Todoist-compatible workflow, search, and automatic account-registration lock.", + "website": "https://github.com/junkdrawerlab/opentask", + "icon": "https://raw.githubusercontent.com/junkdrawerlab/opentask/main/assets/brand/icon.svg", + "architectures": [ + "amd64", + "arm64" + ], + "updated_at": null, + "main_image": "ghcr.io/pranav-karra-3301/opentask:latest", + "category": "productivity", + "category_label": "Productivity & Workflows", + "replaces_discovered_ids": [], + "curated_path": "catalog/curated/opentask.json", + "template": "apps/opentask.json", + "template_status": "generated-unvalidated", + "automatic_install_candidate": true, + "untranslated_blockers": [], + "requires_privileged_lxc": false, + "optional_privileged_lxc": false, + "requires_host_pid_namespace": false, + "requires_relaxed_confinement": false, + "optional_relaxed_confinement": false, + "requires_security_confirmation": false, + "hidden": false, + "template_id": "image-opentask" + }, { "id": "openvscode-server", "provider": "linuxserver.io", @@ -10691,6 +11329,38 @@ "hidden": false, "template_id": "image-paperless-ngx" }, + { + "id": "papra", + "provider": "papra-hq", + "template_family": "curated-profile", + "title": "Papra", + "repository": "https://github.com/papra-hq/papra", + "description": "Self-hosted document management for storing, organizing, searching, and sharing personal documents.", + "website": "https://papra.app/", + "icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/papra.webp", + "architectures": [ + "amd64", + "arm64" + ], + "updated_at": null, + "main_image": "ghcr.io/papra-hq/papra:latest", + "category": "documents", + "category_label": "Documents & Notes", + "replaces_discovered_ids": [], + "curated_path": "catalog/curated/papra.json", + "template": "apps/papra.json", + "template_status": "generated-unvalidated", + "automatic_install_candidate": true, + "untranslated_blockers": [], + "requires_privileged_lxc": false, + "optional_privileged_lxc": false, + "requires_host_pid_namespace": false, + "requires_relaxed_confinement": false, + "optional_relaxed_confinement": false, + "requires_security_confirmation": false, + "hidden": false, + "template_id": "image-papra" + }, { "id": "pcsx2", "provider": "linuxserver.io", @@ -10893,6 +11563,38 @@ "hidden": false, "template_id": "image-pgadmin" }, + { + "id": "photofield", + "provider": "SmilyOrg", + "template_family": "curated-profile", + "title": "Photofield", + "repository": "https://github.com/SmilyOrg/photofield", + "description": "Self-hosted photo library that indexes local photo collections and keeps its thumbnail cache in persistent storage.", + "website": "https://github.com/SmilyOrg/photofield", + "icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/photofield.webp", + "architectures": [ + "amd64", + "arm64" + ], + "updated_at": null, + "main_image": "ghcr.io/smilyorg/photofield:latest", + "category": "media", + "category_label": "Media & Streaming", + "replaces_discovered_ids": [], + "curated_path": "catalog/curated/photofield.json", + "template": "apps/photofield.json", + "template_status": "generated-unvalidated", + "automatic_install_candidate": true, + "untranslated_blockers": [], + "requires_privileged_lxc": false, + "optional_privileged_lxc": false, + "requires_host_pid_namespace": false, + "requires_relaxed_confinement": false, + "optional_relaxed_confinement": false, + "requires_security_confirmation": false, + "hidden": false, + "template_id": "image-photofield" + }, { "id": "photoprism", "source_app_id": "photoprism", @@ -11259,6 +11961,37 @@ "hidden": true, "template_id": "linuxserver-planka" }, + { + "id": "plants", + "provider": "dhrandy", + "template_family": "curated-profile", + "title": "Plants", + "repository": "https://github.com/dhrandy/plants", + "description": "Self-hosted household plant-care tracker with reminders, photos, and multiple user accounts.", + "website": "https://github.com/dhrandy/plants", + "icon": "https://raw.githubusercontent.com/dhrandy/plants/main/app/static/icon.svg", + "architectures": [ + "amd64" + ], + "updated_at": null, + "main_image": "ghcr.io/dhrandy/plants:latest", + "category": "productivity", + "category_label": "Productivity & Workflows", + "replaces_discovered_ids": [], + "curated_path": "catalog/curated/plants.json", + "template": "apps/plants.json", + "template_status": "generated-unvalidated", + "automatic_install_candidate": true, + "untranslated_blockers": [], + "requires_privileged_lxc": false, + "optional_privileged_lxc": false, + "requires_host_pid_namespace": false, + "requires_relaxed_confinement": false, + "optional_relaxed_confinement": false, + "requires_security_confirmation": false, + "hidden": false, + "template_id": "image-plants" + }, { "id": "plantuml-server", "provider": "plantuml", @@ -13444,6 +14177,38 @@ "hidden": false, "template_id": "image-snapotter" }, + { + "id": "sofa", + "provider": "jakejarvis", + "template_family": "curated-profile", + "title": "Sofa", + "repository": "https://github.com/jakejarvis/sofa", + "description": "Self-hosted movie and TV tracker with watch history, recommendations, and media-server integrations.", + "website": "https://github.com/jakejarvis/sofa", + "icon": "https://raw.githubusercontent.com/jakejarvis/sofa/main/apps/web/public/icon.svg", + "architectures": [ + "amd64", + "arm64" + ], + "updated_at": null, + "main_image": "ghcr.io/jakejarvis/sofa:edge", + "category": "media", + "category_label": "Media & Streaming", + "replaces_discovered_ids": [], + "curated_path": "catalog/curated/sofa.json", + "template": "apps/sofa.json", + "template_status": "generated-unvalidated", + "automatic_install_candidate": true, + "untranslated_blockers": [], + "requires_privileged_lxc": false, + "optional_privileged_lxc": false, + "requires_host_pid_namespace": false, + "requires_relaxed_confinement": false, + "optional_relaxed_confinement": false, + "requires_security_confirmation": false, + "hidden": false, + "template_id": "image-sofa" + }, { "id": "sonarr", "provider": "linuxserver.io", @@ -15747,6 +16512,38 @@ "multi_container": false, "template_id": "image-wbo" }, + { + "id": "web-check", + "provider": "Lissy93", + "template_family": "curated-profile", + "title": "Web Check", + "repository": "https://github.com/Lissy93/web-check", + "description": "Self-hosted website diagnostics for checking DNS, TLS certificates, HTTP headers, and other web properties.", + "website": "https://web-check.xyz/", + "icon": "https://raw.githubusercontent.com/Lissy93/web-check/master/public/favicon.svg", + "architectures": [ + "amd64", + "arm64" + ], + "updated_at": null, + "main_image": "ghcr.io/lissy93/web-check:latest", + "category": "tools", + "category_label": "Tools", + "replaces_discovered_ids": [], + "curated_path": "catalog/curated/web-check.json", + "template": "apps/web-check.json", + "template_status": "generated-unvalidated", + "automatic_install_candidate": true, + "untranslated_blockers": [], + "requires_privileged_lxc": false, + "optional_privileged_lxc": false, + "requires_host_pid_namespace": false, + "requires_relaxed_confinement": false, + "optional_relaxed_confinement": false, + "requires_security_confirmation": false, + "hidden": false, + "template_id": "image-web-check" + }, { "id": "webcord", "provider": "linuxserver.io",