Castopod
Added: 2024-09-19
Last Updated: 2025-04-23
Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.
Run as Context- Castopod runs as root user.
Group: 0 / root
User: 0 / root - MariaDB runs as non-root user.
Group: 999 / mariadb
User: 999 / mariadb - Redis runs as a non-root user and root group.
Group: 0 / root
User: 1001 / redis

Security Capabilities
- Castopod is able to chown files.
- Castopod is able to bypass permission checks.
- Castopod is able bypass permission checks for it's sub-processes.
- Castopod is able to set group ID for it's sub-processes.
- Castopod is able to set user ID for it's sub-processes.
App Metadata (Raw File)
{
"1.1.17": {
"healthy": true,
"supported": true,
"healthy_error": null,
"location": "/__w/apps/apps/trains/community/castopod/1.1.17",
"last_update": "2025-04-23 17:40:39",
"required_features": [],
"human_version": "1.13.4_1.1.17",
"version": "1.1.17",
"app_metadata": {
"app_version": "1.13.4",
"capabilities": [
{
"description": "Castopod is able to chown files.",
"name": "CHOWN"
},
{
"description": "Castopod is able to bypass permission checks.",
"name": "DAC_OVERRIDE"
},
{
"description": "Castopod is able bypass permission checks for it's sub-processes.",
"name": "FOWNER"
},
{
"description": "Castopod is able to set group ID for it's sub-processes.",
"name": "SETGID"
},
{
"description": "Castopod is able to set user ID for it's sub-processes.",
"name": "SETUID"
}
],
"categories": [
"media"
],
"changelog_url": "https://code.castopod.org/adaures/castopod/-/releases",
"date_added": "2024-09-19",
"description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.",
"home": "https://castopod.org",
"host_mounts": [],
"icon": "https://media.sys.truenas.net/apps/castopod/icons/icon.svg",
"keywords": [
"podcast"
],
"lib_version": "2.1.16",
"lib_version_hash": "dac15686f882b9ce65b8549a3d5c0ed7bafe2df7a9028880d1a99b0ff4af1eff",
"maintainers": [
{
"email": "dev@ixsystems.com",
"name": "truenas",
"url": "https://www.truenas.com/"
}
],
"name": "castopod",
"run_as_context": [
{
"description": "Castopod runs as root user.",
"gid": 0,
"group_name": "root",
"uid": 0,
"user_name": "root"
},
{
"description": "MariaDB runs as non-root user.",
"gid": 999,
"group_name": "mariadb",
"uid": 999,
"user_name": "mariadb"
},
{
"description": "Redis runs as a non-root user and root group.",
"gid": 0,
"group_name": "root",
"uid": 1001,
"user_name": "redis"
}
],
"screenshots": [
"https://media.sys.truenas.net/apps/castopod/screenshots/screenshot1.png"
],
"sources": [
"https://hub.docker.com/r/castopod/castopod",
"https://code.castopod.org/adaures/castopod"
],
"title": "Castopod",
"train": "community",
"version": "1.1.17"
},
"schema": {
"groups": [
{
"name": "Castopod Configuration",
"description": "Configure Castopod"
},
{
"name": "Network Configuration",
"description": "Configure Network for Castopod"
},
{
"name": "Storage Configuration",
"description": "Configure Storage for Castopod"
},
{
"name": "Labels Configuration",
"description": "Configure labels for Castopod"
},
{
"name": "Resources Configuration",
"description": "Configure Resources for Castopod"
}
],
"questions": [
{
"variable": "castopod",
"label": "",
"group": "Castopod Configuration",
"schema": {
"type": "dict",
"attrs": [
{
"variable": "db_password",
"label": "Database Password",
"description": "The database password for Castopod.",
"schema": {
"type": "string",
"default": "",
"required": true,
"private": true
}
},
{
"variable": "db_root_password",
"label": "Root Database Password",
"description": "The root database password for Castopod.",
"schema": {
"type": "string",
"default": "",
"required": false,
"private": true
}
},
{
"variable": "redis_password",
"label": "Redis Password",
"description": "The redis password for Castopod.",
"schema": {
"type": "string",
"default": "",
"required": true,
"private": true
}
},
{
"variable": "analytics_salt",
"label": "Analytics Salt",
"description": "The analytics salt for Castopod.",
"schema": {
"type": "string",
"default": "",
"required": true,
"private": true
}
},
{
"variable": "base_url",
"label": "Base URL",
"description": "The base URL for Castopod.</br>\nExample: http://your.server.ip:30085\n",
"schema": {
"type": "uri",
"required": true,
"default": ""
}
},
{
"variable": "web_timeout",
"label": "Web Timeout",
"description": "The timeout for Castopod requests in seconds.",
"schema": {
"type": "int",
"required": true,
"default": 900,
"min": 1
}
},
{
"variable": "web_max_body_size",
"label": "Web Max Body Size",
"description": "The maximum body size for Castopod requests in megabytes.",
"schema": {
"type": "int",
"required": true,
"default": 512,
"min": 1
}
},
{
"variable": "php_memory_limit",
"label": "PHP Memory Limit",
"description": "The PHP memory limit for Castopod.",
"schema": {
"type": "int",
"required": true,
"default": 512,
"min": 1
}
},
{
"variable": "enable_2fa",
"label": "Enable 2FA",
"description": "Enable 2FA for Castopod.",
"schema": {
"type": "boolean",
"default": false
}
},
{
"variable": "disable_https_redirect",
"label": "Disable HTTPS Redirect",
"description": "Disable HTTPS redirect for Castopod. </br>\nThis is useful if you are using a reverse proxy with HTTPS.\n",
"schema": {
"type": "boolean",
"default": true
}
},
{
"variable": "additional_envs",
"label": "Additional Environment Variables",
"description": "Configure additional environment variables for Castopod.",
"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": "network",
"label": "",
"group": "Network Configuration",
"schema": {
"type": "dict",
"attrs": [
{
"variable": "web_port",
"label": "WebUI Port",
"description": "The port for Castopod WebUI",
"schema": {
"type": "int",
"default": 30085,
"required": true,
"$ref": [
"definitions/port"
]
}
}
]
}
},
{
"variable": "storage",
"label": "",
"group": "Storage Configuration",
"schema": {
"type": "dict",
"attrs": [
{
"variable": "data",
"label": "Castopod Data Storage",
"description": "The path to store Castopod Data.",
"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.\n",
"schema": {
"type": "string",
"required": true,
"immutable": 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)"
}
]
}
},
{
"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,
"immutable": true,
"hidden": true,
"default": "data"
}
},
{
"variable": "acl_entries",
"label": "ACL Configuration",
"schema": {
"type": "dict",
"show_if": [
[
"acl_enable",
"=",
true
]
],
"attrs": []
}
}
]
}
},
{
"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": "mariadb_data",
"label": "Castopod MariaDB Data Storage",
"description": "The path to store Castopod MariaDB Data.",
"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.\n",
"schema": {
"type": "string",
"required": true,
"immutable": 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)"
}
]
}
},
{
"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,
"immutable": true,
"hidden": true,
"default": "mariadb_data"
}
},
{
"variable": "acl_entries",
"label": "ACL Configuration",
"schema": {
"type": "dict",
"show_if": [
[
"acl_enable",
"=",
true
]
],
"attrs": []
}
}
]
}
},
{
"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": "additional_storage",
"label": "Additional Storage",
"description": "Additional storage for Castopod.",
"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.\n",
"schema": {
"type": "string",
"required": true,
"default": "ix_volume",
"immutable": true,
"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)"
}
]
}
},
{
"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,
"immutable": 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": "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": "containers",
"label": "Containers",
"description": "Containers where the label should be applied",
"schema": {
"type": "list",
"items": [
{
"variable": "container",
"label": "Container",
"schema": {
"type": "string",
"required": true,
"enum": [
{
"value": "castopod",
"description": "castopod"
},
{
"value": "castopod-web",
"description": "castopod-web"
},
{
"value": "mariadb",
"description": "mariadb"
},
{
"value": "redis",
"description": "redis"
}
]
}
}
]
}
}
]
}
}
]
}
},
{
"variable": "resources",
"label": "",
"group": "Resources Configuration",
"schema": {
"type": "dict",
"attrs": [
{
"variable": "limits",
"label": "Limits",
"schema": {
"type": "dict",
"attrs": [
{
"variable": "cpus",
"label": "CPUs",
"description": "CPUs limit for Castopod.",
"schema": {
"type": "int",
"default": 2,
"required": true
}
},
{
"variable": "memory",
"label": "Memory (in MB)",
"description": "Memory limit for Castopod.",
"schema": {
"type": "int",
"default": 4096,
"required": true
}
}
]
}
}
]
}
}
]
},
"readme": "<h1>Castopod</h1> <p><a href=\"https://castopod.org\">Castopod</a> is an open-source hosting platform made for podcasters who want engage and interact with their audience.</p>",
"changelog": null,
"chart_metadata": {
"app_version": "1.13.4",
"capabilities": [
{
"description": "Castopod is able to chown files.",
"name": "CHOWN"
},
{
"description": "Castopod is able to bypass permission checks.",
"name": "DAC_OVERRIDE"
},
{
"description": "Castopod is able bypass permission checks for it's sub-processes.",
"name": "FOWNER"
},
{
"description": "Castopod is able to set group ID for it's sub-processes.",
"name": "SETGID"
},
{
"description": "Castopod is able to set user ID for it's sub-processes.",
"name": "SETUID"
}
],
"categories": [
"media"
],
"changelog_url": "https://code.castopod.org/adaures/castopod/-/releases",
"date_added": "2024-09-19",
"description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.",
"home": "https://castopod.org",
"host_mounts": [],
"icon": "https://media.sys.truenas.net/apps/castopod/icons/icon.svg",
"keywords": [
"podcast"
],
"lib_version": "2.1.16",
"lib_version_hash": "dac15686f882b9ce65b8549a3d5c0ed7bafe2df7a9028880d1a99b0ff4af1eff",
"maintainers": [
{
"email": "dev@ixsystems.com",
"name": "truenas",
"url": "https://www.truenas.com/"
}
],
"name": "castopod",
"run_as_context": [
{
"description": "Castopod runs as root user.",
"gid": 0,
"group_name": "root",
"uid": 0,
"user_name": "root"
},
{
"description": "MariaDB runs as non-root user.",
"gid": 999,
"group_name": "mariadb",
"uid": 999,
"user_name": "mariadb"
},
{
"description": "Redis runs as a non-root user and root group.",
"gid": 0,
"group_name": "root",
"uid": 1001,
"user_name": "redis"
}
],
"screenshots": [
"https://media.sys.truenas.net/apps/castopod/screenshots/screenshot1.png"
],
"sources": [
"https://hub.docker.com/r/castopod/castopod",
"https://code.castopod.org/adaures/castopod"
],
"title": "Castopod",
"train": "community",
"version": "1.1.17"
}
}
}
Support, maintenance, and documentation for applications within the Community catalog is handled by the TrueNAS community. The TrueNAS Applications Portal hosts but does not validate or maintain any linked resources associated with this app.
There currently aren’t any resources available for this application!
Please help the TrueNAS community create content or discuss this application in the TrueNAS Community forum.