Custom Applications


Get Started with Apps!
App Version: 1.2.5
Train: Stable
Home Page: https://www.truenas.com/
Added: 2024-09-10
Last Updated: 2025-09-02
An application for deploying simple containers.
App Metadata (Raw File)
{
"1.2.8": {
"healthy": true,
"supported": true,
"healthy_error": null,
"location": "/__w/apps/apps/trains/stable/ix-app/1.2.8",
"last_update": "2025-09-02 11:33:24",
"required_features": [],
"human_version": "1.2.5_1.2.8",
"version": "1.2.8",
"app_metadata": {
"annotations": {
"min_scale_version": "24.10.2.2"
},
"app_version": "1.2.5",
"capabilities": [],
"categories": [
"custom"
],
"date_added": "2024-09-10",
"description": "An application for deploying simple containers.",
"home": "https://www.truenas.com/",
"host_mounts": [],
"icon": "https://media.sys.truenas.net/apps/ix-app/icons/icon.webp",
"keywords": [],
"lib_version": "2.1.49",
"lib_version_hash": "e71e6b0122c9446fa5ea6fb07e7eb01b11fb42d549a19845426bbd7e21a42634",
"maintainers": [
{
"email": "dev@ixsystems.com",
"name": "truenas",
"url": "https://www.truenas.com/"
}
],
"name": "ix-app",
"run_as_context": [],
"screenshots": [],
"sources": [],
"title": "iX App",
"train": "stable",
"version": "1.2.8"
},
"schema": {
"groups": [
{
"name": "General",
"description": "General Configuration"
},
{
"name": "Image Configuration",
"description": "Configure the image"
},
{
"name": "Container Configuration",
"description": "Configure the container"
},
{
"name": "Security Context Configuration",
"description": "Configure Security Context for the container"
},
{
"name": "Network Configuration",
"description": "Configure Network for the container"
},
{
"name": "Portal Configuration",
"description": "Configure Portals"
},
{
"name": "Storage Configuration",
"description": "Configure Storage for the container"
},
{
"name": "Labels Configuration",
"description": "Configure Labels for the container"
},
{
"name": "Resources Configuration",
"description": "Configure Resources for the container"
}
],
"questions": [
{
"variable": "notes",
"label": "Notes",
"group": "General",
"description": "Notes about the application, this will be shown in the Notes card. </br>\nYou can use markdown here. This have no effect on the application.\n",
"schema": {
"type": "text"
}
},
{
"variable": "image",
"label": "Image",
"group": "Image Configuration",
"description": "The image to use for the container.",
"schema": {
"type": "dict",
"attrs": [
{
"variable": "repository",
"label": "Repository",
"description": "The repository of the image.",
"schema": {
"type": "string",
"required": true
}
},
{
"variable": "tag",
"label": "Tag",
"description": "The tag of the image.",
"schema": {
"type": "string",
"default": "latest"
}
},
{
"variable": "pull_policy",
"label": "Pull Policy",
"description": "The pull policy for the image.",
"schema": {
"type": "string",
"default": "missing",
"required": true,
"enum": [
{
"value": "missing",
"description": "Pull the image if it is not already present on the host."
},
{
"value": "always",
"description": "Always pull an image even if it is present on the host."
},
{
"value": "never",
"description": "Never pull an image even if it is not present on the host."
}
]
}
}
]
}
},
{
"variable": "hostname",
"label": "Hostname",
"group": "Container Configuration",
"description": "The hostname to use for the container.",
"schema": {
"type": "string",
"default": ""
}
},
{
"variable": "entrypoint",
"label": "Entrypoint",
"group": "Container Configuration",
"description": "Entrypoint to use for the container. </br>\nOverrides the default ENTRYPOINT of the image.\n",
"schema": {
"type": "list",
"default": [],
"items": [
{
"variable": "entrypoint_item",
"label": "",
"schema": {
"type": "string",
"required": true
}
}
]
}
},
{
"variable": "command",
"label": "Command",
"group": "Container Configuration",
"description": "Command to use for the container. </br>\nOverrides the default CMD of the image.\n",
"schema": {
"type": "list",
"default": [],
"items": [
{
"variable": "command_item",
"label": "",
"schema": {
"type": "string",
"required": true
}
}
]
}
},
{
"variable": "TZ",
"label": "Timezone",
"group": "Container Configuration",
"description": "Timezone setting for the container.",
"schema": {
"type": "string",
"default": "Etc/UTC",
"required": true,
"$ref": [
"definitions/timezone"
]
}
},
{
"variable": "envs",
"label": "Environment Variables",
"group": "Container Configuration",
"description": "Configure environment variables.",
"schema": {
"type": "list",
"default": [],
"items": [
{
"variable": "env",
"label": "Environment Variable",
"schema": {
"type": "dict",
"attrs": [
{
"variable": "name",
"label": "Name",
"schema": {
"type": "string",
"required": true
}
},
{
"variable": "value",
"label": "Value",
"schema": {
"type": "string",
"required": true
}
}
]
}
}
]
}
},
{
"variable": "restart_policy",
"label": "Restart Policy",
"group": "Container Configuration",
"description": "The restart policy to use for the container.",
"schema": {
"type": "string",
"default": "no",
"required": true,
"enum": [
{
"value": "no",
"description": "No - Does not restart the container under any circumstances."
},
{
"value": "unless-stopped",
"description": "Unless Stopped - Restarts the container irrespective of the exit code but stops restarting when the service is stopped or removed."
},
{
"value": "on-failure",
"description": "On Failure - Restarts the container if the exit code indicates an error."
},
{
"value": "always",
"description": "Always - Restarts the container until its removal."
}
]
}
},
{
"variable": "max_retry_count",
"label": "Maximum Retry Count",
"group": "Container Configuration",
"description": "Maximum number of retries allowed for a container to exit with a code indicating an error. </br>\nSetting this to zero, will keep restarting the container if it exits with a code indicating an error.\n",
"schema": {
"type": "int",
"required": true,
"default": 0,
"show_if": [
[
"restart_policy",
"=",
"on-failure"
]
]
}
},
{
"variable": "disable_builtin_healthcheck",
"label": "Disable Builtin Healthcheck",
"group": "Container Configuration",
"description": "Disable the built-in HEALTHCHECK defined in the image.\n",
"schema": {
"type": "boolean",
"default": false
}
},
{
"variable": "tty",
"label": "TTY",
"group": "Container Configuration",
"description": "Allocate a pseudo-TTY.</br>\nNote, that due to a bug in the underlying library</br>\nusing this option will cause the logs to not display properly</br>\non the TrueNAS WebUI.</br>\nYou can still view logs using 'docker logs ...'.</br>\nBug: https://github.com/docker/docker-py/issues/1394\n",
"schema": {
"type": "boolean",
"default": false
}
},
{
"variable": "stdin",
"label": "Stdin",
"group": "Container Configuration",
"description": "Keep stdin open on the container.",
"schema": {
"type": "boolean",
"default": false
}
},
{
"variable": "devices",
"label": "Devices",
"group": "Container Configuration",
"description": "Devices to use for the container. </br>\nEg: Host Device: /dev/ttyUSB0, Container Device: /dev/ttyACM0\n",
"schema": {
"type": "list",
"default": [],
"items": [
{
"variable": "device",
"label": "Device",
"schema": {
"type": "dict",
"attrs": [
{
"variable": "host_device",
"label": "Host Device",
"schema": {
"type": "string",
"required": true
}
},
{
"variable": "container_device",
"label": "Container Device",
"schema": {
"type": "string",
"required": true
}
}
]
}
}
]
}
},
{
"variable": "privileged",
"label": "Privileged",
"group": "Security Context Configuration",
"description": "Run the container in privileged mode.",
"schema": {
"type": "boolean",
"default": false
}
},
{
"variable": "capabilities",
"label": "Capabilities",
"group": "Security Context Configuration",
"description": "Add Linux capabilities to the container.",
"schema": {
"type": "dict",
"attrs": [
{
"variable": "add",
"label": "Add",
"schema": {
"type": "list",
"items": [
{
"variable": "capability",
"label": "Capability",
"schema": {
"type": "string",
"required": true
}
}
]
}
}
]
}
},
{
"variable": "run_as_custom_user",
"label": "Custom User",
"group": "Security Context Configuration",
"description": "Run the container as a custom user.",
"schema": {
"type": "boolean",
"default": false
}
},
{
"variable": "run_as",
"label": "",
"group": "Security Context Configuration",
"schema": {
"type": "dict",
"show_if": [
[
"run_as_custom_user",
"=",
true
]
],
"attrs": [
{
"variable": "user",
"label": "User ID",
"description": "The user id that container will run as.",
"schema": {
"type": "int",
"default": 568,
"required": true
}
},
{
"variable": "group",
"label": "Group ID",
"description": "The group id that container will run as.",
"schema": {
"type": "int",
"default": 568,
"required": true
}
}
]
}
},
{
"variable": "host_network",
"label": "Host Network",
"group": "Network Configuration",
"description": "Bind to the host network.",
"schema": {
"type": "boolean",
"default": false
}
},
{
"variable": "ports",
"label": "Ports",
"group": "Network Configuration",
"description": "Configure ports for the container.",
"schema": {
"type": "list",
"show_if": [
[
"host_network",
"=",
false
]
],
"default": [],
"items": [
{
"variable": "port",
"label": "Port",
"schema": {
"type": "dict",
"attrs": [
{
"variable": "bind_mode",
"label": "Port Bind Mode",
"description": "The port bind mode.</br>\n- Publish: The port will be published on the host for external access.</br>\n- Expose: The port will be exposed for inter-container communication.</br>\n",
"schema": {
"type": "string",
"default": "published",
"enum": [
{
"value": "published",
"description": "Publish port on the host for external access"
},
{
"value": "exposed",
"description": "Expose port for inter-container communication"
}
]
}
},
{
"variable": "port_number",
"label": "Host Port",
"schema": {
"type": "int",
"min": 1,
"max": 65535,
"required": true
}
},
{
"variable": "container_port",
"label": "Container Port",
"schema": {
"type": "int",
"min": 1,
"max": 65535,
"required": true
}
},
{
"variable": "protocol",
"label": "Protocol",
"schema": {
"type": "string",
"required": true,
"default": "tcp",
"enum": [
{
"value": "tcp",
"description": "TCP"
},
{
"value": "udp",
"description": "UDP"
}
]
}
},
{
"variable": "host_ips",
"label": "Host IPs",
"description": "IPs on the host to bind this port",
"schema": {
"type": "list",
"show_if": [
[
"bind_mode",
"=",
"published"
]
],
"default": [],
"items": [
{
"variable": "host_ip",
"label": "Host IP",
"schema": {
"type": "string",
"required": true,
"$ref": [
"definitions/node_bind_ip"
]
}
}
]
}
}
]
}
}
]
}
},
{
"variable": "dns_config",
"label": "Custom DNS Setup",
"group": "Network Configuration",
"description": "Configure custom DNS settings for the container.\n",
"schema": {
"type": "dict",
"attrs": [
{
"variable": "nameservers",
"label": "Nameservers",
"description": "The DNS nameservers to use.",
"schema": {
"type": "list",
"items": [
{
"variable": "nameserver",
"label": "Nameserver",
"schema": {
"type": "string",
"required": true
}
}
]
}
},
{
"variable": "searches",
"label": "Search Domains",
"description": "The DNS search domains to use.",
"schema": {
"type": "list",
"items": [
{
"variable": "search",
"label": "Search Domain",
"schema": {
"type": "string",
"required": true
}
}
]
}
},
{
"variable": "options",
"label": "DNS Options",
"description": "The DNS options to use.",
"schema": {
"type": "list",
"items": [
{
"variable": "option",
"label": "Option",
"schema": {
"type": "string",
"required": true
}
}
]
}
}
]
}
},
{
"variable": "portals",
"label": "",
"group": "Portal Configuration",
"schema": {
"type": "list",
"items": [
{
"variable": "portal",
"label": "Portal",
"schema": {
"type": "dict",
"attrs": [
{
"variable": "name",
"label": "Name",
"description": "The name of the portal",
"schema": {
"type": "string",
"default": "Web UI",
"required": true
}
},
{
"variable": "scheme",
"label": "Protocol",
"description": "The protocol for the portal",
"schema": {
"type": "string",
"default": "http",
"required": true,
"enum": [
{
"value": "http",
"description": "HTTP"
},
{
"value": "https",
"description": "HTTPS"
}
]
}
},
{
"variable": "use_node_ip",
"label": "Use Node IP",
"description": "Use the node IP for the portal",
"schema": {
"type": "boolean",
"default": true,
"required": true
}
},
{
"variable": "host",
"label": "Host",
"description": "The host for the portal",
"schema": {
"type": "string",
"default": "",
"show_if": [
[
"use_node_ip",
"=",
false
]
],
"required": true
}
},
{
"variable": "port",
"label": "Port",
"description": "The port for the portal",
"schema": {
"type": "int",
"default": 15000,
"required": true
}
},
{
"variable": "path",
"label": "Path",
"description": "The path for the portal",
"schema": {
"type": "string",
"default": "/",
"required": true
}
}
]
}
}
]
}
},
{
"variable": "storage",
"label": "Storage",
"group": "Storage Configuration",
"description": "Storage for the container.",
"schema": {
"type": "list",
"default": [],
"items": [
{
"variable": "storageEntry",
"label": "Storage Entry",
"schema": {
"type": "dict",
"attrs": [
{
"variable": "type",
"label": "Type",
"description": "ixVolume: Is dataset created automatically by the system.</br>\nHost Path: Is a path that already exists on the system.</br>\nSMB Share: Is a SMB share that is mounted to as a volume.</br>\ntmpfs: Is a temporary directory that will be created on the RAM.</br>\n",
"schema": {
"type": "string",
"required": true,
"default": "ix_volume",
"enum": [
{
"value": "host_path",
"description": "Host Path (Path that already exists on the system)"
},
{
"value": "ix_volume",
"description": "ixVolume (Dataset created automatically by the system)"
},
{
"value": "cifs",
"description": "SMB/CIFS Share (Mounts a volume to a SMB share)"
},
{
"value": "tmpfs",
"description": "Tmpfs (Temporary directory created on the RAM)"
}
]
}
},
{
"variable": "read_only",
"label": "Read Only",
"description": "Mount the volume as read only.",
"schema": {
"type": "boolean",
"default": false
}
},
{
"variable": "mount_path",
"label": "Mount Path",
"description": "The path inside the container to mount the storage.",
"schema": {
"type": "path",
"required": true
}
},
{
"variable": "host_path_config",
"label": "Host Path Configuration",
"schema": {
"type": "dict",
"show_if": [
[
"type",
"=",
"host_path"
]
],
"attrs": [
{
"variable": "acl_enable",
"label": "Enable ACL",
"description": "Enable ACL for the storage.",
"schema": {
"type": "boolean",
"default": false
}
},
{
"variable": "acl",
"label": "ACL Configuration",
"schema": {
"type": "dict",
"show_if": [
[
"acl_enable",
"=",
true
]
],
"attrs": [],
"$ref": [
"normalize/acl"
]
}
},
{
"variable": "path",
"label": "Host Path",
"description": "The host path to use for storage.",
"schema": {
"type": "hostpath",
"show_if": [
[
"acl_enable",
"=",
false
]
],
"required": true
}
}
]
}
},
{
"variable": "ix_volume_config",
"label": "ixVolume Configuration",
"description": "The configuration for the ixVolume dataset.",
"schema": {
"type": "dict",
"show_if": [
[
"type",
"=",
"ix_volume"
]
],
"$ref": [
"normalize/ix_volume"
],
"attrs": [
{
"variable": "acl_enable",
"label": "Enable ACL",
"description": "Enable ACL for the storage.",
"schema": {
"type": "boolean",
"default": false
}
},
{
"variable": "dataset_name",
"label": "Dataset Name",
"description": "The name of the dataset to use for storage.",
"schema": {
"type": "string",
"required": true,
"default": "storage_entry"
}
},
{
"variable": "acl_entries",
"label": "ACL Configuration",
"schema": {
"type": "dict",
"show_if": [
[
"acl_enable",
"=",
true
]
],
"attrs": [],
"$ref": [
"normalize/acl"
]
}
}
]
}
},
{
"variable": "cifs_config",
"label": "SMB Configuration",
"description": "The configuration for the SMB dataset.",
"schema": {
"type": "dict",
"show_if": [
[
"type",
"=",
"cifs"
]
],
"attrs": [
{
"variable": "server",
"label": "Server",
"description": "The server to mount the SMB share.",
"schema": {
"type": "string",
"required": true
}
},
{
"variable": "path",
"label": "Path",
"description": "The path to mount the SMB share.",
"schema": {
"type": "string",
"required": true
}
},
{
"variable": "username",
"label": "Username",
"description": "The username to use for the SMB share.",
"schema": {
"type": "string",
"required": true
}
},
{
"variable": "password",
"label": "Password",
"description": "The password to use for the SMB share.",
"schema": {
"type": "string",
"required": true,
"private": true
}
},
{
"variable": "domain",
"label": "Domain",
"description": "The domain to use for the SMB share.",
"schema": {
"type": "string"
}
}
]
}
},
{
"variable": "tmpfs_config",
"label": "Tmpfs Configuration",
"description": "The configuration for the tmpfs dataset.",
"schema": {
"type": "dict",
"show_if": [
[
"type",
"=",
"tmpfs"
]
],
"attrs": [
{
"variable": "size",
"label": "Tmpfs Size Limit (in Mi)",
"description": "The maximum size (in Mi) of the temporary directory.</br>\nFor example: 500\n",
"schema": {
"type": "int",
"default": 500,
"required": true
}
}
]
}
}
]
}
}
]
}
},
{
"variable": "labels",
"label": "",
"group": "Labels Configuration",
"schema": {
"type": "list",
"default": [],
"items": [
{
"variable": "label",
"label": "Label",
"schema": {
"type": "dict",
"attrs": [
{
"variable": "key",
"label": "Key",
"schema": {
"type": "string",
"required": true
}
},
{
"variable": "value",
"label": "Value",
"schema": {
"type": "string",
"required": true
}
}
]
}
}
]
}
},
{
"variable": "resources",
"label": "",
"group": "Resources Configuration",
"schema": {
"type": "dict",
"attrs": [
{
"variable": "enable_resource_limits",
"label": "Enable Resource Limits",
"group": "Resources Configuration",
"description": "Enable resource limits for the container.",
"schema": {
"type": "boolean",
"default": false
}
},
{
"variable": "limits",
"label": "Limits",
"schema": {
"type": "dict",
"show_if": [
[
"enable_resource_limits",
"=",
true
]
],
"attrs": [
{
"variable": "cpus",
"label": "CPUs",
"description": "CPUs limit for the container.",
"schema": {
"type": "int",
"default": 2,
"required": true
}
},
{
"variable": "memory",
"label": "Memory (in MB)",
"description": "Memory limit for the container.",
"schema": {
"type": "int",
"default": 4096,
"required": true
}
}
]
}
},
{
"variable": "gpus",
"group": "Resources Configuration",
"label": "GPU Configuration",
"schema": {
"type": "dict",
"$ref": [
"definitions/gpu_configuration"
],
"attrs": []
}
}
]
}
}
]
},
"readme": "<h1>iX App</h1> <p>iX App is designed to let user deploy a docker image in TrueNAS SCALE with a simple wizard.</p>",
"changelog": null,
"chart_metadata": {
"annotations": {
"min_scale_version": "24.10.2.2"
},
"app_version": "1.2.5",
"capabilities": [],
"categories": [
"custom"
],
"date_added": "2024-09-10",
"description": "An application for deploying simple containers.",
"home": "https://www.truenas.com/",
"host_mounts": [],
"icon": "https://media.sys.truenas.net/apps/ix-app/icons/icon.webp",
"keywords": [],
"lib_version": "2.1.49",
"lib_version_hash": "e71e6b0122c9446fa5ea6fb07e7eb01b11fb42d549a19845426bbd7e21a42634",
"maintainers": [
{
"email": "dev@ixsystems.com",
"name": "truenas",
"url": "https://www.truenas.com/"
}
],
"name": "ix-app",
"run_as_context": [],
"screenshots": [],
"sources": [],
"title": "iX App",
"train": "stable",
"version": "1.2.8"
}
}
}
How to install and configure custom or third-party applications in TrueNAS.
Installing Custom Apps
This article covers installing custom applications in TrueNAS. For details on how to set up app storage, configure global settings, and prepare TrueNAS to deploy applications, see Initial Setup. For installing applications from the TrueNAS catalog, see Installing Apps.
TrueNAS includes the ability to install third-party apps in Docker containers that allow users to deploy apps not included in the catalog. Generally, any container that follows the Open Container Initiative specifications can be deployed.