2026-10-26 07:16:45 +01:00
{
"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." ,
2026-10-26 07:21:36 +01:00
"The upstream Docker image includes the web server and scheduler in one image; there is no database or scheduler container to add." ,
"For HTTPS behind a reverse proxy, update APP_URL, SESSION_DOMAIN and SANCTUM_STATEFUL_DOMAINS to match the public domain and port."
2026-10-26 07:16:45 +01:00
],
"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" : "" ,
2026-10-26 07:21:36 +01:00
"compose_sha256" : "efc376b06def85ad573a1d29b1ef3f2b02c5b23bc99b6d2fc5253e82333b1f25" ,
2026-10-26 07:16:45 +01:00
"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"
2026-10-26 07:21:36 +01:00
},
{
"name" : "SESSION_DOMAIN" ,
"example" : "@CONTAINER_ADDRESS@" ,
"required" : true ,
"sensitive" : false ,
"container_address" : "@CONTAINER_ADDRESS@" ,
"source" : "upstream-documentation"
},
{
"name" : "SANCTUM_STATEFUL_DOMAINS" ,
"example" : "@CONTAINER_ADDRESS@:8080" ,
"required" : true ,
"sensitive" : false ,
"container_address" : "@CONTAINER_ADDRESS@:8080" ,
"source" : "upstream-documentation"
2026-10-26 07:16:45 +01:00
}
],
"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 ,
2026-10-26 07:21:36 +01:00
"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 \"SESSION_DOMAIN\": \"@CONTAINER_ADDRESS@\",\n \"SANCTUM_STATEFUL_DOMAINS\": \"@CONTAINER_ADDRESS@:8080\"\n }\n }\n }\n}"
2026-10-26 07:16:45 +01:00
},
"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
}
}