Copy disabled (too large)
Download .txt
Showing preview only (122,396K chars total). Download the full file to get everything.
Repository: truenas/apps
Branch: master
Commit: c8a0e7b7a443
Files: 65499
Total size: 337.3 MB
Directory structure:
gitextract_paekjaim/
├── .flake8
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── app-request.yaml
│ │ ├── bug-report.yaml
│ │ └── enhancement-request.yaml
│ ├── PULL_REQUEST_TEMPLATE/
│ │ └── app_addition.md
│ ├── copilot-instructions.md
│ ├── pull_request_template.md
│ ├── renovate-config.js
│ ├── renovate.json
│ ├── scripts/
│ │ ├── changed_apps.py
│ │ ├── ci.py
│ │ ├── generate_metadata.py
│ │ ├── message.py
│ │ ├── port_validation.py
│ │ └── renovate_bump.sh
│ └── workflows/
│ ├── app-test-suite.yaml
│ ├── dev_apps_validate.yml
│ ├── library-tests.yaml
│ ├── python-lint.yaml
│ ├── renovate.yaml
│ └── update_catalog.yaml
├── .gitignore
├── CONTRIBUTIONS.md
├── LICENSE
├── README.md
├── catalog.json
├── cspell.config.yaml
├── devbox.json
├── features_capability.json
├── ix-dev/
│ ├── community/
│ │ ├── actual-budget/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── app_migrations.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── migrations/
│ │ │ │ └── ip_port_migration
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ ├── basic-values.yaml
│ │ │ ├── hostnet-values.yaml
│ │ │ └── https-values.yaml
│ │ ├── adguard-home/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── app_migrations.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── migrations/
│ │ │ │ └── ip_port_migration
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ ├── basic-values.yaml
│ │ │ └── dhcp-values.yaml
│ │ ├── adventurelog/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── app_migrations.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── migrations/
│ │ │ │ └── set_default_postgis_image
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── affine/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── aiostreams/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── anki-sync-server/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── app_migrations.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── migrations/
│ │ │ │ └── rename_web_port
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── anything-llm/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ ├── basic-values.yaml
│ │ │ └── https-values.yaml
│ │ ├── arcane/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── archisteamfarm/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── arti/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ ├── macros/
│ │ │ │ └── setup.py.jinja
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── audiobookshelf/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── app_migrations.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── migrations/
│ │ │ │ ├── ip_port_migration
│ │ │ │ └── remove_host_net
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── authelia/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── authentik/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── app_migrations.yaml
│ │ │ ├── deprecations.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── migrations/
│ │ │ │ ├── enable_deprecated_media
│ │ │ │ ├── remove_deprecated_media
│ │ │ │ └── remove_redis
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── autobrr/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── app_migrations.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── migrations/
│ │ │ │ └── ip_port_migration
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── automatic-ripping-machine/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── autoxpose/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── backrest/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── baserow/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── bazarr/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── app_migrations.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── migrations/
│ │ │ │ └── ip_port_migration
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── bentopdf/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── beszel-hub/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── bichon/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── bitcoind/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── app_migrations.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── migrations/
│ │ │ │ └── remove_max_orphan_txs
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ ├── macros/
│ │ │ │ └── setup.py.jinja
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── bitcoind-knots/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ ├── macros/
│ │ │ │ └── setup.py.jinja
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── bitmagnet/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── blinko/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── bookshelf/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ ├── basic-values.yaml
│ │ │ └── softcover-values.yaml
│ │ ├── bookstack/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── borgwarehouse/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── boxarr/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── briefkasten/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── app_migrations.yaml
│ │ │ ├── deprecations.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── migrations/
│ │ │ │ └── ip_port_migration
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ ├── basic-values.yaml
│ │ │ └── extra-values.yaml
│ │ ├── byparr/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── calibre/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── app_migrations.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── migrations/
│ │ │ │ └── ip_port_migration
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── calibre-web/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── castopod/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── app_migrations.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── migrations/
│ │ │ │ └── ip_port_migration
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ ├── 2fa-values.yaml
│ │ │ ├── basic-values.yaml
│ │ │ └── redirect-values.yaml
│ │ ├── change-detection/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── channels-dvr/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── app_migrations.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── migrations/
│ │ │ │ └── fix_run_as
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ ├── basic-values.yaml
│ │ │ └── nvidia-values.yaml
│ │ ├── chatwoot/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ ├── basic-values.yaml
│ │ │ └── ce-values.yaml
│ │ ├── chia/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── app_migrations.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── migrations/
│ │ │ │ └── ip_port_migration
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ ├── macros/
│ │ │ │ └── init.sh
│ │ │ └── test_values/
│ │ │ ├── basic-values.yaml
│ │ │ └── farmer-values.yaml
│ │ ├── clamav/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── app_migrations.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── migrations/
│ │ │ │ └── ip_port_migration
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ ├── basic-values.yaml
│ │ │ ├── milterd-values.yaml
│ │ │ ├── no-clamd-values.yaml
│ │ │ └── no-freshclamd-values.yaml
│ │ ├── cleanuparr/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── cloudbeaver/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── cloudflared/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── app_migrations.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── migrations/
│ │ │ │ ├── remove_proxy_mode
│ │ │ │ └── remove_tunnel_dns_field
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── cloudreve/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ ├── basic-values.yaml
│ │ │ └── fts-values.yaml
│ │ ├── cockpit-ws/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── code-server/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── app_migrations.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── migrations/
│ │ │ │ └── set_deprecated_volumes
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── concourse/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ ├── macros/
│ │ │ │ └── keys.sh
│ │ │ └── test_values/
│ │ │ ├── basic-values.yaml
│ │ │ └── https-values.yaml
│ │ ├── continuwuity/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ ├── basic-values.yaml
│ │ │ └── no-federation-values.yaml
│ │ ├── convertx/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── coolify/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ └── basic-values.yaml
│ │ ├── copyparty/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │ │ │ ├── expose.py
│ │ │ │ ├── extra_hosts.py
│ │ │ │ ├── formatter.py
│ │ │ │ ├── functions.py
│ │ │ │ ├── healthcheck.py
│ │ │ │ ├── labels.py
│ │ │ │ ├── networks.py
│ │ │ │ ├── notes.py
│ │ │ │ ├── portals.py
│ │ │ │ ├── ports.py
│ │ │ │ ├── render.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── restart.py
│ │ │ │ ├── security_opts.py
│ │ │ │ ├── storage.py
│ │ │ │ ├── sysctls.py
│ │ │ │ ├── tests/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_build_image.py
│ │ │ │ │ ├── test_configs.py
│ │ │ │ │ ├── test_container.py
│ │ │ │ │ ├── test_depends.py
│ │ │ │ │ ├── test_deps.py
│ │ │ │ │ ├── test_device.py
│ │ │ │ │ ├── test_device_cgroup_rules.py
│ │ │ │ │ ├── test_dns.py
│ │ │ │ │ ├── test_environment.py
│ │ │ │ │ ├── test_expose.py
│ │ │ │ │ ├── test_extra_hosts.py
│ │ │ │ │ ├── test_formatter.py
│ │ │ │ │ ├── test_functions.py
│ │ │ │ │ ├── test_healthcheck.py
│ │ │ │ │ ├── test_labels.py
│ │ │ │ │ ├── test_networks.py
│ │ │ │ │ ├── test_notes.py
│ │ │ │ │ ├── test_portal.py
│ │ │ │ │ ├── test_ports.py
│ │ │ │ │ ├── test_render.py
│ │ │ │ │ ├── test_resources.py
│ │ │ │ │ ├── test_restart.py
│ │ │ │ │ ├── test_security_opts.py
│ │ │ │ │ ├── test_sysctls.py
│ │ │ │ │ ├── test_truenas_client.py
│ │ │ │ │ ├── test_validations.py
│ │ │ │ │ └── test_volumes.py
│ │ │ │ ├── tmpfs.py
│ │ │ │ ├── truenas_client.py
│ │ │ │ ├── validations.py
│ │ │ │ ├── volume_mount.py
│ │ │ │ ├── volume_mount_types.py
│ │ │ │ ├── volume_sources.py
│ │ │ │ ├── volume_types.py
│ │ │ │ └── volumes.py
│ │ │ └── test_values/
│ │ │ ├── basic-values.yaml
│ │ │ ├── dj-values.yaml
│ │ │ ├── https-values.yaml
│ │ │ ├── im-values.yaml
│ │ │ ├── iv-values.yaml
│ │ │ └── min-values.yaml
│ │ ├── crafty-4/
│ │ │ ├── README.md
│ │ │ ├── app.yaml
│ │ │ ├── item.yaml
│ │ │ ├── ix_values.yaml
│ │ │ ├── questions.yaml
│ │ │ └── templates/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── library/
│ │ │ │ └── base_v2_3_4/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── configs.py
│ │ │ │ ├── container.py
│ │ │ │ ├── depends.py
│ │ │ │ ├── deploy.py
│ │ │ │ ├── deps.py
│ │ │ │ ├── deps_cron.py
│ │ │ │ ├── deps_elastic.py
│ │ │ │ ├── deps_guacd.py
│ │ │ │ ├── deps_mariadb.py
│ │ │ │ ├── deps_meilisearch.py
│ │ │ │ ├── deps_memcached.py
│ │ │ │ ├── deps_mongodb.py
│ │ │ │ ├── deps_perms.py
│ │ │ │ ├── deps_postgres.py
│ │ │ │ ├── deps_redis.py
│ │ │ │ ├── deps_solr.py
│ │ │ │ ├── deps_tika.py
│ │ │ │ ├── device.py
│ │ │ │ ├── device_cgroup_rules.py
│ │ │ │ ├── devices.py
│ │ │ │ ├── dns.py
│ │ │ │ ├── docker_client.py
│ │ │ │ ├── environment.py
│ │ │ │ ├── error.py
│ │
================================================
FILE CONTENTS
================================================
================================================
FILE: .flake8
================================================
[flake8]
max-line-length = 120
================================================
FILE: .gitattributes
================================================
ix-dev/*/*/templates/library/base_*/** linguist-generated=true
================================================
FILE: .github/ISSUE_TEMPLATE/app-request.yaml
================================================
name: App Request
description: Request an app to be added to the catalog
title: "[App Request]: "
labels: ["app-request", "triage"]
body:
- type: input
id: app-name
attributes:
label: App Name
description: What is the name of the app you want to request?
placeholder: ex. My Cool App
validations:
required: true
- type: input
id: description
attributes:
label: App Description
description: Please provide a brief description of the app.
placeholder: ex. This app does amazing things!
validations:
required: true
- type: input
id: app-website
attributes:
label: App Website / Github Repo
description: What is the website URL for the app?
placeholder: ex. https://mycoolapp.com
validations:
required: true
- type: input
id: app-installation
attributes:
label: Docker Installation Documentation
description: Where can we find documentation for installing this app as a Docker container?
placeholder: ex. https://mycoolapp.com/docs/installation or https://hub.docker.com/r/username/appname
validations:
required: true
- type: input
id: icon-url
attributes:
label: App Icon URL
description: What is the URL for the app's icon? (Preferably SVG or high-resolution PNG)
placeholder: ex. https://mycoolapp.com/icon.svg
- type: input
id: docker-image
attributes:
label: Docker Image
description: What is the official Docker image for this app? (Preferably ghcr.io)
placeholder: ex. ghcr.io/username/appname or username/appname
- type: dropdown
id: app-category
attributes:
label: App Category
description: What category does this app belong to?
options:
- Media
- Productivity
- Development
- Networking
- Security
- Storage
- Monitoring
- Database
- Web Server
- Communication
- Gaming
- Finance
- Other
validations:
required: true
- type: checkboxes
id: requirements
attributes:
label: Requirements Checklist
description: Please confirm the following requirements
options:
- label: The app is actively maintained
required: true
- label: The app has official Docker images available
required: true
- label: The app has versioned image tags available
required: false
- label: The app is open source or has a free tier
required: false
- label: I have tested the Docker installation locally
required: false
- type: textarea
id: additional-info
attributes:
label: Additional Information
description: Please provide any other information that may be relevant to your request (use case, popularity, similar apps, etc.)
================================================
FILE: .github/ISSUE_TEMPLATE/bug-report.yaml
================================================
name: Bug Report
description: Report a bug with an app
title: "[Bug Report]: "
labels: ["bug", "triage"]
body:
- type: input
id: app-name
attributes:
label: App Name
description: What is the name of the app you want to report a bug for?
placeholder: ex. My Cool App
validations:
required: true
- type: input
id: version
attributes:
label: Version (TrueNAS Catalog App Version)
description: |
⚠️ Please enter the `Version`, not the `App Version` field.
What version of the TrueNAS Catalog App are you using?
- `Version` = TrueNAS Catalog App version (e.g., 1.0.0)
- `App Version` = Actual software version (e.g., 10.10.7)
We need the TrueNAS Catalog App version to identify the specific deployment configuration.
placeholder: ex. 1.0.0 (TrueNAS Catalog App version)
validations:
required: true
- type: input
id: os-version
attributes:
label: TrueNAS OS Version
description: What version of TrueNAS are you running?
placeholder: 25.04
- type: textarea
id: app-issue
attributes:
label: App Issue
description: Please describe the issue you are experiencing.
validations:
required: true
- type: textarea
id: app-logs
attributes:
label: App Logs
render: shell
description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
================================================
FILE: .github/ISSUE_TEMPLATE/enhancement-request.yaml
================================================
name: Enhancement Request
description: Request an enhancement or improvement to an existing app
title: "[Enhancement]: "
labels: ["enhancement", "triage"]
body:
- type: input
id: app-name
attributes:
label: App Name
description: What is the name of the app you want to request an enhancement for?
placeholder: ex. My Cool App
validations:
required: true
- type: input
id: version
attributes:
label: Current Version (TrueNAS Catalog App Version)
description: |
⚠️ Please enter the `Version`, not the `App Version` field.
What version of the TrueNAS Catalog App are you currently using?
- `Version` = TrueNAS Catalog App version (e.g., 1.0.0)
- `App Version` = Actual software version (e.g., 10.10.7)
We need the TrueNAS Catalog App version to identify the specific deployment configuration.
placeholder: ex. 1.0.0 (TrueNAS Catalog App version)
validations:
required: true
- type: textarea
id: enhancement-description
attributes:
label: Enhancement Description
description: Please describe the enhancement you would like to see.
placeholder: Describe the feature or improvement you'd like...
validations:
required: true
- type: textarea
id: use-case
attributes:
label: Use Case
description: Please explain why this enhancement would be useful and what problem it would solve.
placeholder: This would help with...
validations:
required: true
- type: textarea
id: proposed-solution
attributes:
label: Proposed Solution
description: If you have ideas on how this could be implemented, please share them here.
placeholder: This could be implemented by...
- type: textarea
id: alternatives
attributes:
label: Alternatives Considered
description: Have you considered any alternative solutions or workarounds?
placeholder: I've also considered...
- type: textarea
id: additional-context
attributes:
label: Additional Context
description: Please provide any other information that may be relevant to your enhancement request.
================================================
FILE: .github/PULL_REQUEST_TEMPLATE/app_addition.md
================================================
# App Addition
- [ ] I have opened an [issue](https://github.com/truenas/apps/issues) to discuss this app addition before submitting this pull request.
# AI
- [ ] Part or All of this PR was generated by an LLM.
## Description
Adds [App Name] to the community train.
[Brief description of what the app does]
## App Information
- **Upstream**: https://github.com/upstream/repo
- **Documentation**: https://docs.upstream.com
- **App Version**: 2.1.0
## Testing
Tested locally with:
- [ ] basic-values.yaml
All tests passed successfully.
## Icons and Screenshots
Please upload the following to the CDN:
- Icon: [attach or link]
- Screenshot 1 (optional): [attach or link]
## Special Notes
- First-time setup instructions: [if applicable]
- Any other important information
## Checklist
- [ ] App runs successfully locally
- [ ] Only modified files under /ix-dev/ or /library/
- [ ] README.md included
- [ ] Multiple test scenarios tested
- [ ] questions.yaml has clear descriptions and follows structure of existing apps
- [ ] All automated CI checks pass
================================================
FILE: .github/copilot-instructions.md
================================================
# Copilot Instructions
## Files to Ignore
Do not suggest code completions, changes, edits, or code reviews for files matching these patterns:
1. `trains/*` - All files in the trains directory
2. `ix-dev/*/templates/library/base_v*/` - All base template files in ix-dev library templates
When working in this repository, skip any analysis, suggestions, or code reviews for files in these directories.
================================================
FILE: .github/pull_request_template.md
================================================
# Pull Request
⚠️⚠️⚠️ **BEFORE CREATING THE PR** ⚠️⚠️⚠️
Please go to the **Preview** tab and select the appropriate template:
* [🚀 App Addition](?expand=1&template=app_addition.md)
================================================
FILE: .github/renovate-config.js
================================================
module.exports = {
extends: [],
// https://docs.renovatebot.com/self-hosted-configuration/#dryrun
dryRun: null,
// https://docs.renovatebot.com/configuration-options/#gitauthor
gitAuthor: "bugclerk <bugclerk@ixsystems.com>",
// https://docs.renovatebot.com/self-hosted-configuration/#onboarding
onboarding: false,
// https://docs.renovatebot.com/configuration-options/#dependencydashboard
dependencyDashboard: true,
// https://docs.renovatebot.com/self-hosted-configuration/#platform
platform: "github",
// https://docs.renovatebot.com/self-hosted-configuration/#repositories
repositories: ["truenas/apps"],
// https://docs.renovatebot.com/self-hosted-configuration/#allowpostupgradecommandtemplating
allowPostUpgradeCommandTemplating: true,
// https://docs.renovatebot.com/self-hosted-configuration/#allowedpostupgradecommands
// TODO: Restrict this.
allowedPostUpgradeCommands: ["^.*"],
enabledManagers: ["custom.regex", "github-actions"],
customManagers: [
{
customType: "regex",
// Match only ix_values.yaml files in the ix-dev directory
fileMatch: ["^ix-dev/.*/ix_values\\.yaml$"],
// Matches the repository name and the tag of each image
matchStrings: [
"\\s{4}repository: (?<depName>[^\\s]+)\\n\\s{4}tag: [\"']?(?<currentValue>[^\\s\"']+)[\"']?",
],
// Use the docker datasource on matched images
datasourceTemplate: "docker",
},
],
packageRules: [
{
matchManagers: ["custom.regex"],
matchDatasources: ["docker"],
postUpgradeTasks: {
// What to "git add" after the commands are run
fileFilters: [
"ix-dev/**/app.yaml", // For the version update
"ix-dev/**/templates/**", // For the app lib versioned dir
],
// Execute the following commands for every dep.
executionMode: "update",
commands: [
// https://docs.renovatebot.com/templates/#other-available-fields
"./.github/scripts/renovate_bump.sh {{{packageFileDir}}} patch {{{depName}}} {{{newValue}}} {{{branchName}}}",
],
},
},
{
matchManagers: ["github-actions"],
addLabels: ["actions"],
groupName: "gh-actions",
additionalBranchPrefix: "gh-actions",
},
{
matchDatasources: ["docker"],
matchUpdateTypes: ["major"],
labels: ["major"],
},
{
matchDatasources: ["docker"],
matchUpdateTypes: ["minor"],
groupName: "updates-patch-minor",
labels: ["minor"],
},
{
matchDatasources: ["docker"],
matchUpdateTypes: ["patch"],
groupName: "updates-patch-minor",
labels: ["patch"],
},
{
matchDatasources: ["docker"],
labels: ["enterprise"],
groupName: "enterprise",
matchFileNames: ["ix-dev/enterprise/**"],
},
// Custom versioning matching
// https://docs.renovatebot.com/modules/versioning/regex/#rangesconstraints
customVersioning(
// There are tags with date format (24.08.0), but newer versions are semver
// We still limit major to 1 digit, as we don't want to match "24.08.0" as a major version
// This is something that we need to investigate if one of the images start having 2 digit major versions
"^(?<major>\\d{1})\\.(?<minor>\\d+)\\.(?<patch>\\d+)$",
[
"ghcr.io/linuxserver/deluge",
"ghcr.io/linuxserver/heimdall",
"ghcr.io/linuxserver/transmission",
],
),
customVersioning(
// YYYY-MM-DD-rN
"^(?<major>\\d{4})-(?<minor>\\d{2})-(?<patch>\\d{2})-(?<build>r\\d+)$",
["ghcr.io/zoeyvid/npmplus"],
),
customVersioning(
// 1.16.1 - There are some tags like 1.120.20221218 that are not semver and are too old
"^(?<major>\\d{1})\\.(?<minor>\\d{2})\\.(?<patch>\\d+)$",
["ghcr.io/linuxserver/kasm"],
),
customVersioning(
// The current major version is 2.x.x, but there is a random 5.x.x tag.
// So we limit it to 0-4 for major. Date issue mentioned above still stands
"^(?<major>[0-4]{1})\\.(?<minor>\\d+)\\.(?<patch>\\d+)$",
["ghcr.io/linuxserver/diskover", "ghcr.io/linuxserver/calibre-web"],
),
customVersioning(
// abc123-ls241
"^(?<build>[a-z0-9]+)-ls(?<major>\\d{1})(?<minor>\\d{1})(?<patch>\\d{1})$",
["ghcr.io/linuxserver/tvheadend", "ghcr.io/linuxserver/lazylibrarian"],
),
customVersioning(
// v0.8.1-omnibus
"^v(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)-omnibus$",
["ghcr.io/analogj/scrutiny"],
),
customVersioning(
// 1.40.2.8395-c67dce28e
"^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)\\.(?<build>[0-9]{3,5}-[a-f0-9]{7,9})$",
["plexinc/pms-docker"],
),
customVersioning(
// Older versions was 20220101 and newer versions are 240101
"^(?<major>\\d{2})(?<minor>\\d{2})(?<patch>\\d{2})$",
["photoprism/photoprism"],
),
customVersioning(
// RELEASE.2024-08-26T15-33-07Z
"^RELEASE\\.(?<major>\\d+)-(?<minor>\\d+)-(?<patch>\\d+)T\\d+-\\d+-\\d+Z$",
["minio/minio", "quay.io/minio/aistor/minio"],
),
customVersioning(
// version-6.0.0
"^version-(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)$",
["fireflyiii/core", "fireflyiii/data-importer"],
),
customVersioning(
// 2.462.1-jdk21
"^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)-jdk21$",
["jenkins/jenkins"],
),
customVersioning(
// 1.2.3.0, but not 1.2.3.4 (4th digit != 0 equals beta)
"^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)\\.0$",
["emby/embyserver"],
),
customVersioning(
// 2023.12.31-3535377c9
"^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)-.+$",
["searxng/searxng"],
),
customVersioning(
// tailscale considers beta releases when minor part ends with an odd number
"^v(?<major>\\d+)\\.(?<minor>\\d+[02468]+)\\.(?<patch>\\d+)$",
["ghcr.io/tailscale/tailscale"],
),
customVersioning(
// 3.0.0.0-full
"^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)\\.(?<build>\\d+)-full$",
["apache/tika"],
),
customVersioning(
// 20250122_091948 {year}{month}{day}_{build}
"^(?<major>\\d{4})(?<minor>\\d{2})(?<patch>\\d{2})_(?<build>\\d+)$",
["ghcr.io/nextcloud-releases/aio-imaginary"],
),
customVersioning(
// 2024.10.22-7ca5933
"^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)-(?<build>.+)$",
["ghcr.io/corentinth/it-tools"],
),
customVersioning(
// 2.5.x -- Yes x is exact value and not a placeholder
"^(?<major>\\d+)\\.(?<minor>\\d+)\\.x$",
["uroni/urbackup-server"],
),
customVersioning(
// 1.1.11-1 or 1.1.11
"^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)(-(?<build>\\d+))?$",
["rustdesk/rustdesk-server"],
),
customVersioning(
// 9.0.2-stable
"^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)-stable$",
["lmscommunity/lyrionmusicserver"],
),
customVersioning(
// 2.1.0.3-stable
"^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)\\.(?<build>\\d+)-stable$",
["duplicati/duplicati"],
),
customVersioning(
// 18.0-20250218
"^(?<major>\\d+)\\.(?<minor>\\d+)-(?<patch>\\d+)$",
["odoo"],
),
customVersioning(
// 1.0.0-hash
"^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)-(?<build>.+)$",
["ixsystems/nextcloud-notify-push"],
),
customVersioning(
// 1.0.0-fpm-hash
"^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)-fpm-(?<build>.+)$",
["ixsystems/nextcloud-fpm"],
),
customVersioning(
// v0.137.0-noble-lite
"^v(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)-noble-(?<compatibility>full|nvidia|lite)$",
["ghcr.io/koush/scrypted"],
),
customVersioning(
// v24.7
"^v(?<major>\\d+)\\.(?<minor>\\d+)$",
["nzbgetcom/nzbget"],
),
customVersioning(
// 0.96
"^(?<major>\\d+)\\.(?<minor>\\d+)$",
["bbernhard/signal-cli-rest-api"],
),
customVersioning(
// vanilla-1.4.4.9
"^vanilla-(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)\\.(?<build>\\d+)(-\\d+)?$",
["ryshe/terraria"],
),
customVersioning(
// 335
"^(?<patch>\\d+)$",
["quay.io/cockpit/ws"],
),
customVersioning(
// 0.3_0.18
"^(?<major>\\d+)\\.(?<minor>\\d+)_(?<patch>\\d+)\\.(?<build>\\d+)$",
["ghcr.io/magicgrants/monero-lws"],
),
customVersioning(
// 6.1.4.2
"^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)\\.(?<build>\\d+)$",
["ghcr.io/justarchinet/archisteamfarm"],
),
customVersioning(
// 0.1.4.2
"^0\\.(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)$",
["ghcr.io/sassanix/warracker/main"],
),
customVersioning(
// amd64-3.3.13
"^amd64-(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)$",
["joplin/server"],
),
customVersioning(
// v1.52.0-jammy
"^v(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)-(?<build>(noble|jammy))$",
["mcr.microsoft.com/playwright"],
),
customVersioning(
// i2p-2.8.1
"^i2p-(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)(-(?<build>\\d+))?$",
["geti2p/i2p"],
),
customVersioning(
// 0.18.0-rootless
"^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)-rootless$",
["ghcr.io/sysadminsmedia/homebox"],
),
customVersioning(
// 17-3.5
"^18-(?<major>\\d+)\\.(?<minor>\\d+)$",
["postgis/postgis"],
),
customVersioning(
// 0.8.1-pg18-trixie
"^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)-pg18(-\\w+)?$",
["pgvector/pgvector"],
),
customVersioning(
// 2.4-dev
"^(?<major>\\d+)\\.(?<minor>\\d+)-dev$",
["wger/server"],
),
customVersioning(
// 15-vectorchord0.3.0
"^15-vectorchord(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)$",
["ghcr.io/immich-app/postgres"],
),
customVersioning(
// v1.134.0(-cuda|rocm|openvino)?
"^v(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)(?:-(?<compatibility>cuda|rocm|openvino))?$",
["ghcr.io/immich-app/immich-machine-learning"],
),
customVersioning(
// stable-2.0.55
"^stable-(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)$",
["factoriotools/factorio"],
),
customVersioning(
// 5.15.24.18
"^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)\\.(?<build>\\d+)$",
["mbentley/omada-controller"],
),
customVersioning(
// apache-2.37.0
"^apache-(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)$",
["kimai/kimai2"],
),
customVersioning(
// 4.0.0-beta.434
"^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)-beta\\.(?<build>\\d+)$",
["ghcr.io/coollabsio/coolify"],
),
customVersioning(
// appname-1.2.3
"^(?<compatibility>arcade|calculator|cast|draw-io|external-sites|importer|json-viewer|maps|pastebin|progress-bars|unzip)-(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)$",
["opencloudeu/web-extensions"],
),
customVersioning(
// 1.0.0-alpha.67
"^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)(-alpha\\.(?<build>\\d+))?$",
["rustfs/rustfs"],
),
customVersioning(
// 10.0.160-mongo8
"^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)$",
["ghcr.io/goofball222/unifi"],
),
customVersioning(
// hardcover-v0.4.20.91
"^(?<compatibility>hardcover|softcover)-v(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)\\.(?<build>\\d+)$",
["ghcr.io/pennydreadful/bookshelf"],
),
customVersioning(
// component-1.2.3
"^(?<compatibility>backend|frontend|fc-worker-api|fc-worker-celery)-(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)$",
["amrit3701/lens"],
),
customVersioning(
// release-1.11.0
"^release-(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)$",
["ghcr.io/lukegus/termix"],
),
customVersioning(
// slim-v1.12.2
"^slim-v(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)$",
["itzcrazykns1337/vane"],
),
],
};
function customVersioning(versioningRegex, packages) {
return {
matchDatasources: ["docker"],
versioning: `regex:${versioningRegex}`,
matchPackageNames: packages,
};
}
================================================
FILE: .github/renovate.json
================================================
{}
================================================
FILE: .github/scripts/changed_apps.py
================================================
#!/usr/bin/env python3
import pathlib
import json
import sys
import re
APP_REGEX = re.compile(r"^ix-dev\/([-\w\.]+)\/([-\w\.]+)")
TEST_VALUES_DIR = "templates/test_values"
OUTPUT_FILE = ".github/outputs/all_changed_files.json"
EXCLUDE_TESTS = [
"stable/storj",
]
def get_changed_files():
with open(OUTPUT_FILE, "r") as f:
json_files = f.read()
if not json_files:
print(f"File [{OUTPUT_FILE}] is empty", file=sys.stderr)
exit(1)
try:
return json.loads(json_files.replace("\\", ""))
except json.JSONDecodeError:
print(f"Failed to decode JSON from [{OUTPUT_FILE}] file", file=sys.stderr)
exit(1)
def find_test_files(changed_files):
seen = set()
matrix = []
skipped = set()
for file in changed_files:
match = APP_REGEX.match(file)
if not match:
continue
full_name = f"{match.group(1)}/{match.group(2)}"
if full_name in EXCLUDE_TESTS:
if full_name not in skipped:
skipped.add(full_name)
continue
for file in pathlib.Path("ix-dev", full_name, TEST_VALUES_DIR).glob("*.yaml"):
item_tuple = (match.group(1), match.group(2), file.name)
if item_tuple not in seen:
print(
f"Detected changed item for [{full_name}] adding [{file.name}] to matrix",
file=sys.stderr,
)
seen.add(item_tuple)
matrix.append(
{
"train": match.group(1),
"app": match.group(2),
"test_file": file.name,
}
)
if skipped:
print("Skipped apps based on the EXCLUDE_TESTS list:", file=sys.stderr)
print("\n".join(skipped), file=sys.stderr)
if len(matrix) > 256 * 3:
print(f"Detected test files ({len(matrix)}) exceeded 768 limit", file=sys.stderr)
print("Additional matrices need to be added to the workflow", file=sys.stderr)
sys.exit(1)
result = {
"matrix1": {"include": matrix[0:256]},
"matrix2": {"include": matrix[256:512]},
"matrix3": {"include": matrix[512:768]},
}
return json.dumps(result)
def main():
changed_files = get_changed_files()
print(f"Detected {len(changed_files)} changed files", file=sys.stderr)
print(find_test_files(changed_files))
# This should look like:
# {
# "matrix1": {
# "include": [
# { "train": "enterprise", "app": "minio", "test_file": "basic-values.yaml" },
# { "train": "enterprise", "app": "minio", "test_file": "https-values.yaml" },
# ...
# ]
# },
# "matrix2": {
# "include": [
# { "train": "enterprise", "app": "minio", "test_file": "basic-values.yaml" },
# { "train": "enterprise", "app": "minio", "test_file": "https-values.yaml" },
# ...
# ]
# }
# }
if __name__ == "__main__":
main()
================================================
FILE: .github/scripts/ci.py
================================================
#!/usr/bin/env python3
# /// script
# requires-python = ">=3.11"
# dependencies = [
# "pyyaml",
# ]
# ///
import subprocess
import argparse
import pathlib
import secrets
import shutil
import json
import yaml
import sys
import os
CONTAINER_IMAGE = "ghcr.io/truenas/apps_validation:latest"
PLATFORM = "linux/amd64"
# Used to print mostly structured data, like yaml or json
# so they can be piped to a file or jq, etc
def print_stdout(msg):
print(msg)
# Prints to stderr so the output is not mixed with stdout
def print_stderr(msg):
print(msg, file=sys.stderr)
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument(
"--app",
required=True,
help="The name of the app",
)
parser.add_argument(
"--train",
required=True,
help="The name of the train for the app",
)
parser.add_argument(
"--test-file",
required=True,
help="Name of the test file to use as values",
)
parser.add_argument(
"--render-only",
required=False,
default=False,
type=bool,
help="Prints the rendered docker-compose file",
)
parser.add_argument(
"--render-only-debug",
required=False,
default=False,
type=bool,
help="Prints the rendered docker-compose file even if it's not a valid yaml",
)
parser.add_argument(
"--wait",
required=False,
default=False,
type=bool,
help="Wait for user input before stopping the app",
)
parsed = parser.parse_args()
return {
"app": parsed.app,
"train": parsed.train,
"test_file": parsed.test_file,
"render_only": parsed.render_only,
"render_only_debug": parsed.render_only_debug,
"project": secrets.token_hex(16),
"wait": parsed.wait,
}
def print_info():
print_stderr("Parameters:")
print_stderr(f" - app: [{args['app']}]")
print_stderr(f" - train: [{args['train']}]")
print_stderr(f" - project: [{args['project']}]")
print_stderr(f" - test-file: [{args['test_file']}]")
print_stderr(f" - render-only: [{args['render_only']}]")
print_stderr(f" - render-only-debug: [{args['render_only_debug']}]")
print_stderr(f" - wait: [{args['wait']}]")
def command_exists(command):
return shutil.which(command) is not None
def check_required_commands():
required_commands = ["docker", "jq", "openssl"]
for command in required_commands:
if not command_exists(command):
print_stderr(f"Error: command [{command}] is not installed")
sys.exit(1)
def get_base_cmd():
rendered_compose = "templates/rendered/docker-compose.yaml"
return " ".join(
[
f"docker compose -p {args['project']} -f",
f"ix-dev/{args['train']}/{args['app']}/{rendered_compose}",
]
)
def pull_app_catalog_container():
print_stderr(f"Pulling container image [{CONTAINER_IMAGE}]")
res = subprocess.run(
f"docker pull --platform {PLATFORM} --quiet {CONTAINER_IMAGE}",
shell=True,
capture_output=True,
)
if res.returncode != 0:
print_stderr(f"Failed to pull container image [{CONTAINER_IMAGE}]")
sys.exit(1)
print_stderr(f"Done pulling container image [{CONTAINER_IMAGE}]")
def fix_permissions(file_path):
print_stderr("Fixing permissions")
cmd = " ".join(
[
f"docker run --platform {PLATFORM} --quiet --rm -v {os.getcwd()}:/workspace -e FAKE_ENV=1",
f"--entrypoint /bin/bash {CONTAINER_IMAGE} -c 'chmod 777 /workspace/{file_path}'",
]
)
res = subprocess.run(cmd, shell=True, capture_output=True)
if res.returncode != 0:
print_stderr(f"Failed to fix permissions for file [{file_path}]")
print_stderr(res.stderr.decode("utf-8"))
sys.exit(1)
print_stderr(f"Done fixing permissions for file [{file_path}]")
def render_compose():
print_stderr("Rendering docker-compose file")
test_values_dir = "templates/test_values"
app_dir = f"ix-dev/{args['train']}/{args['app']}"
cmd = " ".join(
[
f"docker run --platform {PLATFORM} --quiet --rm",
"-e FAKE_ENV=1",
f"-v {os.getcwd()}:/workspace",
"-v /var/run/docker.sock:/var/run/docker.sock:ro",
CONTAINER_IMAGE,
"apps_render_app render",
f"--path /workspace/{app_dir}",
f"--values /workspace/{app_dir}/{test_values_dir}/{args['test_file']}",
]
)
print_cmd(cmd)
separator_start()
res = subprocess.run(cmd, shell=True)
separator_start()
if res.returncode != 0:
print_stderr("Failed to render docker-compose file")
sys.exit(1)
template_file = f"{app_dir}/templates/rendered/docker-compose.yaml"
fix_permissions(template_file)
with open(template_file, "r") as f:
try:
out = yaml.safe_load(f)
except yaml.YAMLError as e:
print_stderr(f"Failed to parse rendered docker-compose file [{e}]")
with open(template_file, "r") as f:
print_stderr(f"Syntax Error in rendered docker-compose file:\n{f.read()}")
sys.exit(1)
if args["render_only_debug"]:
print_stderr("Successfully rendered docker-compose file:")
print_stdout(yaml.dump(out))
sys.exit(0)
print_stderr("Done rendering docker-compose file")
def update_x_portals(parsed_compose):
portals = parsed_compose.get("x-portals", [])
for portal in portals:
scheme = portal.get("scheme", "http")
host = portal.get("host", "localhost").replace("0.0.0.0", "localhost")
port = str(portal.get("port", "80" if scheme == "http" else "443"))
url = scheme + "://" + host + ":" + port + portal.get("path", "")
x_portals.append(f"[{portal['name']}] - {url}")
def print_docker_compose_config():
print_stderr("Printing docker compose config (parsed compose)")
cmd = f"{get_base_cmd()} config"
print_cmd(cmd)
separator_start()
res = subprocess.run(cmd, shell=True, capture_output=True)
separator_end()
if res.returncode != 0:
print_stderr("Failed to print docker compose config")
if res.stdout:
print_stderr(res.stdout.decode("utf-8"))
if res.stderr:
print_stderr(res.stderr.decode("utf-8"))
sys.exit(1)
if args["render_only"]:
print_stdout(res.stdout.decode("utf-8"))
sys.exit(0)
data = yaml.safe_load(res.stdout.decode("utf-8"))
update_x_portals(data)
print_stderr(res.stdout.decode("utf-8"))
def separator_start():
print_stderr("=" * 40 + "+++++" + "=" * 40)
def separator_end():
print_stderr("=" * 40 + "-----" + "=" * 40)
def print_cmd(cmd):
print_stderr(f"Running command [{cmd}]")
def docker_cleanup():
cmd = f"{get_base_cmd()} down --remove-orphans --volumes"
print_cmd(cmd)
separator_start()
subprocess.run(cmd, shell=True)
separator_end()
cmd = f"{get_base_cmd()} rm --force --stop --volumes"
print_cmd(cmd)
separator_start()
subprocess.run(cmd, shell=True)
separator_end()
def print_logs():
# Get all service names
ps = f"{get_base_cmd()} ps --all --format" + " {{.Service}}"
print_cmd(ps)
res = subprocess.run(ps, shell=True, capture_output=True)
if res.returncode != 0:
print_stderr("Failed to get running containers")
sys.exit(1)
# Parse output
services = res.stdout.decode("utf-8").split("\n")
if not services:
print_stderr("No services found to print logs for")
return
# Remove empty lines and whitespace
services = [s.strip() for s in services if s.strip()]
for service in services:
cmd = f"{get_base_cmd()} logs {service}"
print_cmd(cmd)
separator_start()
subprocess.run(cmd, shell=True)
separator_end()
def print_docker_processes():
cmd = f"{get_base_cmd()} ps --all"
print_cmd(cmd)
separator_start()
subprocess.run(cmd, shell=True)
separator_end()
def get_parsed_containers():
# Outputs one container per line, in json format
cmd = f"{get_base_cmd()} ps --all --format json"
print_cmd(cmd)
all_containers = subprocess.run(cmd, shell=True, capture_output=True).stdout.decode("utf-8")
parsed_containers = []
for line in all_containers.split("\n"):
if not line:
continue
try:
parsed_containers.append(json.loads(line))
except json.JSONDecodeError:
print_stderr(f"Failed to parse container status output:\n {line}")
sys.exit(1)
return parsed_containers
def status_indicates_healthcheck_existence(container):
"""Assumes healthcheck exists if status contains "health" """
# eg "health: starting". This happens right after a container is started or restarted
return "(health: starting)" in container.get("Status", "")
def state_indicates_restarting(container):
"""Assumes restarting if state is "restarting" """
return container.get("State", "") == "restarting"
def exit_code_indicates_normal_exit(container):
"""Assumes normal exit if there is no exit code or if it is 0"""
return container.get("ExitCode", 0) == 0
def health_indicates_healthy(container):
"""Assumes healthy if there is no health status or if it is "healthy" """
health = container.get("Health", "")
if health in ["healthy", ""]:
return True
return False
def is_considered_healthy(container):
message = [
f"✅ Healthy container skipped [{container['Name']}({container['ID']})] with status [{container.get('State')}]"
+ " for the following reasons:"
]
reasons = []
if health_indicates_healthy(container):
reasons.append("\t- Container is healthy")
if exit_code_indicates_normal_exit(container):
reasons.append(f"\t- Exit code is [{container.get('ExitCode', 0)}]")
if not state_indicates_restarting(container):
reasons.append("\t- Container is not restarting")
if not status_indicates_healthcheck_existence(container):
reasons.append("\t- Status does not indicate a healthcheck exists")
# Mark it as healthy if ALL of the following are true:
# 1. It is healthy
# 2. Its exit code is normal
# 3. Its not restarting
# 4. It does not indicate a healthcheck exists
# For #4, there was some cases where the container was restarting and at the time of check,
# the "Health" was empty and "State" was "running" (similar to init containers). This check
# added to try to catch those cases, by inspecting the "Status" field which if there is a healthcheck
# it will contain the word "health".
result = (
health_indicates_healthy(container)
and exit_code_indicates_normal_exit(container)
and not state_indicates_restarting(container)
and not status_indicates_healthcheck_existence(container)
)
return {"result": result, "reasons": "\n".join(message + reasons)}
def get_failed_containers():
parsed_containers = get_parsed_containers()
failed = []
for container in parsed_containers:
# Skip containers that are exited with 0 (eg init containers),
# but not restarting (during a restart exit code is 0)
is_healthy = is_considered_healthy(container)
if is_healthy["result"]:
print_stderr(is_healthy["reasons"])
continue
failed.append(container)
return failed
def get_container_name(container):
return container["Name"].replace(args["project"] + "-", "")
def print_inspect_data(container):
cmd = f"docker container inspect {container['ID']}"
print_cmd(cmd + f". Container: [{get_container_name(container)}]]")
res = subprocess.run(cmd, shell=True, capture_output=True)
data = json.loads(res.stdout.decode("utf-8"))
separator_start()
print_stdout(json.dumps(data, indent=4))
separator_end()
def run_app():
cmd = f"{get_base_cmd()} up --detach --quiet-pull --wait --wait-timeout 600"
print_cmd(cmd)
res = subprocess.run(cmd, shell=True, capture_output=True)
print_docker_processes()
print_logs()
print_stderr(f"Exit code: {res.returncode}")
if res.returncode != 0:
if res.stderr:
stderr = res.stderr.decode("utf-8")
err_msg = "error response from daemon"
if err_msg in stderr.lower():
print_stderr(
"\nDocker exited with non-zero code and no containers were found.\n"
+ "Most likely docker couldn't start one of the containers at all.\n"
+ "Such cases are for example when a device is not available on the host.\n"
+ "or image cannot be found.\n\n"
+ stderr
)
return res.returncode or 99
parsed_containers = get_parsed_containers()
if not parsed_containers:
print_stderr(
"Docker exited with non-zero code and no containers were found.\n"
+ "Most likely docker couldn't start the containers at all.\n"
)
return res.returncode or 99
failed_containers = get_failed_containers()
failed_containers_names = "\n".join([f"\t-{c['Name']} ({c['ID']})" for c in failed_containers])
if not failed_containers:
print_stderr("✅ No failed containers found")
else:
print_stderr(
f"❌ Found [{len(failed_containers)}]"
+ f"failed containers that failed to start:\n {failed_containers_names}"
)
for container in failed_containers:
print_stderr(f"Container [{container['Name']}({container['ID']})] exited. Printing Inspect Data")
print_inspect_data(container)
# https://github.com/docker/compose/issues/10596
# `--wait` will return 1 even if a container exits with 0.
# Although it seems that it only happens on specific compose files, while on others it is not.
# Cases that a container exits with 0 that are expected is for example an init container.
return res.returncode if len(failed_containers) > 0 else 0
print_stderr("Containers started successfully")
return 0
def check_app_dir_exists():
if not os.path.exists(f"ix-dev/{args['train']}/{args['app']}"):
print_stderr(f"App directory [ix-dev/{args['train']}/{args['app']}] does not exist")
sys.exit(1)
def copy_lib():
cmd = " ".join(
[
f"docker run --platform {PLATFORM} --quiet --rm",
f"-e FAKE_ENV=1 -v {os.getcwd()}:/workspace {CONTAINER_IMAGE}",
f"apps_catalog_hash_generate --path /workspace --train {args['train']} --app {args['app']}",
]
)
print_cmd(cmd)
separator_start()
res = subprocess.run(cmd, shell=True, capture_output=True)
print_stderr(res.stdout.decode("utf-8"))
separator_start()
if res.returncode != 0:
print_stderr("Failed to generate hashes and copy lib")
sys.exit(1)
def copy_macros():
if not os.path.exists("macros"):
print_stderr("Macros directory does not exist. Skipping macros copy")
return
print_stderr("Copying macros")
target_macros_dir = f"ix-dev/{args['train']}/{args['app']}/templates/macros/global"
os.makedirs(target_macros_dir, exist_ok=True)
if pathlib.Path(target_macros_dir).exists():
shutil.rmtree(target_macros_dir, ignore_errors=True)
try:
shutil.copytree("macros", target_macros_dir, dirs_exist_ok=True)
except shutil.Error:
print_stderr("Failed to copy macros")
sys.exit(1)
def generate_item_file():
with open(f"ix-dev/{args['train']}/{args['app']}/app.yaml", "r") as f:
app_yaml = yaml.safe_load(f)
item_file = f"ix-dev/{args['train']}/{args['app']}/item.yaml"
item_data = {
"icon_url": app_yaml.get("icon", ""),
"categories": app_yaml.get("categories", []),
"screenshots": app_yaml.get("screenshots", []),
"tags": app_yaml.get("keywords", []),
}
with open(item_file, "w") as f:
yaml.dump(item_data, f)
def wait_for_user_input():
print_stderr("Press enter to stop the app")
try:
input()
except KeyboardInterrupt:
pass
def main():
print_info()
check_app_dir_exists()
pull_app_catalog_container()
copy_lib()
copy_macros()
generate_item_file()
check_required_commands()
render_compose()
print_docker_compose_config()
res = run_app()
if args["wait"]:
if not x_portals:
print_stderr("No portals found")
else:
print_stderr("\nPortals:")
print_stderr("\n".join(x_portals) + "\n")
wait_for_user_input()
docker_cleanup()
if res == 0:
print_stderr("Successfully rendered and run docker-compose file")
else:
print_stderr("Failed to render and run docker-compose file")
sys.exit(res)
args = parse_args()
x_portals = []
if __name__ == "__main__":
main()
================================================
FILE: .github/scripts/generate_metadata.py
================================================
#!/usr/bin/env python3
"""
TrueNAS Apps Capability Manager
This script analyzes Docker Compose configurations for TrueNAS apps and updates
their metadata with capability requirements extracted from rendered templates.
"""
# /// script
# requires-python = ">=3.11"
# dependencies = [
# "pyyaml",
# ]
# ///
import os
import re
import sys
import yaml
import logging
import argparse
import subprocess
from pathlib import Path
from typing import Any, Dict, List, Set, Optional, Tuple
from dataclasses import dataclass
# Global configuration
class Config:
CONTAINER_IMAGE = "ghcr.io/truenas/apps_validation:latest"
PLATFORM = "linux/amd64"
RE_VAR_NAME = r"^[a-z0-9_]+$"
# Directory structure
APPS_ROOT_DIR = "ix-dev"
TEST_VALUES_DIR = "templates/test_values"
RENDERED_COMPOSE_PATH = "templates/rendered/docker-compose.yaml"
# File names
APP_METADATA_FILE = "app.yaml"
APP_VALUES_FILE = "ix_values.yaml"
QUESTIONS_FILE = "questions.yaml"
# Special apps excluded from test train
EXCLUDED_TEST_APPS = {"other-nginx", "nginx"}
# Setup logging
logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s")
logger = logging.getLogger(__name__)
@dataclass(frozen=True)
class DockerCapability:
"""Represents a Docker capability with its human-readable description."""
name: str
description: str
def to_dict(self) -> Dict[str, str]:
return {"description": self.description, "name": self.name}
@dataclass
class AppAnalysisResult:
"""Results from analyzing an app's Docker compose configurations."""
capabilities: List[DockerCapability]
service_names: List[str]
app_version: str
service_users: Dict[str, Tuple[int, int]] # Maps service name to (uid, gid)
@dataclass
class AppManifest:
"""Represents an app's basic information and test configurations."""
path: Path
name: str
train: str
test_value_files: List[str]
class DockerCapabilityRegistry:
"""Registry of Docker capabilities with their descriptions."""
_CAPABILITY_DESCRIPTIONS = {
"AUDIT_CONTROL": "able to control audit subsystem configuration",
"AUDIT_READ": "able to read audit log entries",
"AUDIT_WRITE": "able to write records to audit log",
"BLOCK_SUSPEND": "able to block system suspend operations",
"BPF": "able to use Berkeley Packet Filter programs",
"CHECKPOINT_RESTORE": "able to use checkpoint/restore functionality",
"CHOWN": "able to change file ownership arbitrarily",
"DAC_OVERRIDE": "able to bypass file permission checks",
"DAC_READ_SEARCH": "able to bypass read/execute permission checks",
"FOWNER": "able to bypass permission checks for file operations",
"FSETID": "able to preserve set-user-ID and set-group-ID bits",
"IPC_LOCK": "able to lock memory segments in RAM",
"IPC_OWNER": "able to bypass permission checks for IPC operations",
"KILL": "able to send signals to any process",
"LEASE": "able to establish file leases",
"LINUX_IMMUTABLE": "able to set immutable and append-only file attributes",
"MAC_ADMIN": "able to configure Mandatory Access Control",
"MAC_OVERRIDE": "able to override Mandatory Access Control restrictions",
"MKNOD": "able to create special files using mknod()",
"NET_ADMIN": "able to perform network administration tasks",
"NET_BIND_SERVICE": "able to bind to privileged ports (< 1024)",
"NET_BROADCAST": "able to make socket broadcasts",
"NET_RAW": "able to use raw and packet sockets",
"PERFMON": "able to access performance monitoring interfaces",
"SETFCAP": "able to set file capabilities on other files",
"SETGID": "able to change group ID of processes",
"SETPCAP": "able to transfer capabilities between processes",
"SETUID": "able to change user ID of processes",
"SYS_ADMIN": "able to perform system administration operations",
"SYS_BOOT": "able to reboot and load/unload kernel modules",
"SYS_CHROOT": "able to use chroot() system call",
"SYS_MODULE": "able to load and unload kernel modules",
"SYS_NICE": "able to modify process scheduling priority",
"SYS_PACCT": "able to configure process accounting",
"SYS_PTRACE": "able to trace and control other processes",
"SYS_RAWIO": "able to perform raw I/O operations",
"SYS_RESOURCE": "able to override resource limits",
"SYS_TIME": "able to set system clock and real-time clock",
"SYS_TTY_CONFIG": "able to configure TTY devices",
"SYSLOG": "able to perform privileged syslog operations",
"WAKE_ALARM": "able to trigger system wake alarms",
}
_RENAME_MAPPINGS = {
"dssystem": "DS System",
"npm": "Nginx Proxy Manager",
"npmplus": "Nginx Proxy Manager Plus",
"omada": "Omada Controller",
"lms": "Lyrion Media Server",
}
_USER_MAPPINGS = {
4: "sync",
5: "games",
6: "man",
100: "_apt",
102: "systemd-network",
103: "systemd-resolve",
104: "messagebus",
105: "avahi",
106: "_rpc",
107: "statd",
108: "consul",
109: "nvpd",
110: "nslcd",
111: "sshd",
112: "systemd-coredump",
113: "Debian-snmp",
114: "ntp",
115: "Debian-exim",
116: "tftp",
117: "sssd",
118: "tcpdump",
120: "proftpd",
121: "ftp",
122: "nut",
123: "dnsmasq",
124: "ladvd",
125: "nova",
126: "haproxy",
127: "uuidd",
128: "ntpsec",
129: "tss",
130: "iperf3",
131: "_chrony",
999: "netdata",
65534: "nobody",
}
_GROUP_MAPPINGS = {
4: "adm",
5: "tty",
6: "disk",
12: "man",
14: "ftp",
15: "kmem",
20: "dialout",
21: "fax",
22: "voice",
24: "cdrom",
25: "floppy",
26: "tape",
27: "sudo",
29: "audio",
30: "dip",
37: "operator",
40: "src",
42: "shadow",
43: "utmp",
44: "video",
45: "sasl",
46: "plugdev",
50: "staff",
60: "games",
100: "users",
102: "systemd-journal",
103: "systemd-network",
104: "systemd-resolve",
105: "input",
106: "kvm",
107: "render",
108: "crontab",
109: "netdev",
110: "ssh",
111: "messagebus",
112: "avahi",
113: "consul",
114: "nvpd",
115: "nslcd",
116: "systemd-coredump",
117: "Debian-snmp",
118: "ssl-cert",
119: "ntp",
120: "Debian-exim",
121: "tftp",
122: "sssd",
123: "tcpdump",
124: "rdma",
126: "nut",
127: "ladvd",
128: "libvirt",
129: "nova",
130: "haproxy",
131: "uuidd",
132: "i2c",
133: "sgx",
134: "_ssh",
135: "ntpsec",
136: "tss",
137: "iperf3",
138: "_chrony",
544: "builtin_administrators",
545: "builtin_users",
546: "builtin_guests",
951: "truenas_readonly_administrators",
952: "truenas_sharing_administrators",
995: "incus-admin",
996: "incus",
997: "netdata",
999: "docker",
65534: "nogroup",
}
_COMMON_UID_GID_MAPPINGS = {
0: "root",
1: "daemon",
2: "bin",
3: "sys",
7: "lp",
8: "mail",
9: "news",
10: "uucp",
13: "proxy",
33: "www-data",
34: "backup",
38: "list",
39: "irc",
41: "gnats",
101: "systemd-timesync",
568: "apps",
666: "webdav",
950: "truenas_admin",
986: "libvirt-qemu",
998: "polkitd",
}
@staticmethod
def service_name_to_title(service_name: str) -> str:
"""Convert a service name to a human-readable title."""
return service_name.replace("-", " ").replace("_", " ").title()
@staticmethod
def hash_service_name(service_name: str) -> str:
"""Hash a service name to a short, unique identifier."""
return service_name.lower().replace("_", "").replace("-", "").replace(" ", "")
@classmethod
def uid_to_user_name(cls, uid: int) -> str:
"""Convert a UID to a human-readable user name."""
if uid in cls._COMMON_UID_GID_MAPPINGS:
return f"Host user is [{cls._COMMON_UID_GID_MAPPINGS[uid]}]"
elif uid in cls._USER_MAPPINGS:
return f"Host user is [{cls._USER_MAPPINGS[uid]}]"
else:
# log warning
logger.warning(f"Unknown UID: {uid}")
return f"Host user is [unknown ({uid})]"
@classmethod
def gid_to_group_name(cls, gid: int) -> str:
"""Convert a GID to a human-readable group name."""
if gid in cls._COMMON_UID_GID_MAPPINGS:
return f"Host group is [{cls._COMMON_UID_GID_MAPPINGS[gid]}]"
elif gid in cls._GROUP_MAPPINGS:
return f"Host group is [{cls._GROUP_MAPPINGS[gid]}]"
else:
# log warning
logger.warning(f"Unknown GID: {gid}")
return f"Host group is [unknown ({gid})]"
@classmethod
def create_capability_description(cls, capability_name: str, service_names: List[str], title: str) -> str:
"""Create a human-readable description for a capability and its services."""
if capability_name not in cls._CAPABILITY_DESCRIPTIONS:
raise ValueError(f"Unknown capability: {capability_name}")
if not service_names:
raise ValueError(f"No services provided for capability: {capability_name}")
clean_service_names = set()
for name in service_names:
parts = name.split("-")
if parts[-1].isnumeric():
name = "-".join(parts[:-1])
clean_service_names.add(name)
formatted_services = []
for name in clean_service_names:
if cls.hash_service_name(name) == cls.hash_service_name(title):
formatted_services.append(title)
elif name.lower() in cls._RENAME_MAPPINGS:
formatted_services.append(cls._RENAME_MAPPINGS[name.lower()])
else:
formatted_services.append(cls.service_name_to_title(name))
base_description = cls._CAPABILITY_DESCRIPTIONS[capability_name]
if len(formatted_services) == 1:
return f"{formatted_services[0]} is {base_description}"
else:
return f"{', '.join(sorted(formatted_services))} are {base_description}"
class FileSystemCache:
"""Simple file system cache to avoid repeated file reads."""
def __init__(self):
self._yaml_cache = {}
def read_yaml_file(self, file_path: Path) -> Dict:
"""Read and cache YAML file contents."""
# Convert to string for hashing
file_key = str(file_path)
# Check if file is cached and still valid
if file_key in self._yaml_cache:
cached_data, cached_mtime = self._yaml_cache[file_key]
try:
current_mtime = file_path.stat().st_mtime
if current_mtime == cached_mtime:
return cached_data
except OSError:
# File might have been deleted, remove from cache
del self._yaml_cache[file_key]
# Read and cache the file
try:
with open(file_path, "r") as f:
data = yaml.safe_load(f)
# Ensure we have a dict
if not isinstance(data, dict):
raise ValueError(f"YAML file {file_path} must contain a dictionary at root level, got {type(data)}")
# Cache with modification time
mtime = file_path.stat().st_mtime
self._yaml_cache[file_key] = (data, mtime)
return data
except (IOError, yaml.YAMLError) as e:
raise RuntimeError(f"Failed to read YAML file {file_path}") from e
def write_yaml_file(self, file_path: Path, data: Dict) -> None:
"""Write YAML data to file and invalidate cache."""
try:
with open(file_path, "w") as f:
yaml.dump(data, f, default_flow_style=False, sort_keys=False)
# Remove from cache since file was modified
file_key = str(file_path)
if file_key in self._yaml_cache:
del self._yaml_cache[file_key]
except IOError as e:
raise RuntimeError(f"Failed to write YAML file {file_path}") from e
def clear_cache(self) -> None:
"""Clear all cached data."""
self._yaml_cache.clear()
class AppDiscoveryService:
"""Service for discovering and validating TrueNAS apps."""
def __init__(self, apps_root_dir: str = Config.APPS_ROOT_DIR):
self.apps_root_path = Path(apps_root_dir)
def discover_all_apps(self) -> List[AppManifest]:
"""Discover all valid apps across all trains."""
if not self.apps_root_path.exists():
logger.error(f"Apps root directory {self.apps_root_path} does not exist")
return []
all_apps = []
for train_path in self.apps_root_path.iterdir():
if not train_path.is_dir():
continue
train_name = train_path.name
logger.info(f"Scanning train: {train_name}")
train_apps = self._discover_apps_in_train(train_path, train_name)
all_apps.extend(train_apps)
logger.info(f"Discovered {len(all_apps)} apps total")
return all_apps
def discover_single_app(self, train_name: str, app_name: str) -> Optional[AppManifest]:
"""Discover a specific app by train and name."""
app_path = self.apps_root_path / train_name / app_name
return self._create_app_manifest(app_path, train_name)
def _discover_apps_in_train(self, train_path: Path, train_name: str) -> List[AppManifest]:
"""Discover all apps within a specific train."""
apps = []
for app_path in train_path.iterdir():
if not app_path.is_dir():
continue
app_manifest = self._create_app_manifest(app_path, train_name)
if app_manifest:
apps.append(app_manifest)
return apps
def _create_app_manifest(self, app_path: Path, train_name: str) -> Optional[AppManifest]:
"""Create an AppManifest for a single app directory."""
app_name = app_path.name
# Skip excluded apps in test train
if train_name == "test" and app_name in Config.EXCLUDED_TEST_APPS:
logger.debug(f"Skipping excluded test app: {app_name}")
return None
# Validate required files exist
if not (app_path / Config.APP_METADATA_FILE).exists():
logger.warning(f"Skipping {app_path}: missing {Config.APP_METADATA_FILE}")
return None
# Find test value files
test_values_path = app_path / Config.TEST_VALUES_DIR
test_value_files = []
if test_values_path.exists():
test_value_files = [f.name for f in test_values_path.iterdir() if f.is_file() and f.suffix == ".yaml"]
if not test_value_files:
logger.warning(f"No test values found for {app_path}")
logger.debug(f"Found app: {app_path} with {len(test_value_files)} test configurations")
return AppManifest(path=app_path, name=app_name, train=train_name, test_value_files=test_value_files)
class DockerComposeRenderer:
"""Handles rendering TrueNAS apps using Docker container."""
def __init__(self, container_image: str = Config.CONTAINER_IMAGE, platform: str = Config.PLATFORM):
self.container_image = container_image
self.platform = platform
def render_app_with_values(self, app_manifest: AppManifest, test_values_filename: str) -> Dict:
"""Render an app with specific test values and return compose data."""
workspace_path = os.getcwd()
values_path = app_manifest.path / Config.TEST_VALUES_DIR / test_values_filename
docker_cmd = [
"docker",
"run",
f"--platform={self.platform}",
"--quiet",
"--rm",
"-e FAKE_ENV=1",
f"-v={workspace_path}:/workspace",
"-v=/var/run/docker.sock:/var/run/docker.sock:ro",
self.container_image,
"apps_render_app",
"render",
f"--path=/workspace/{app_manifest.path}",
f"--values=/workspace/{values_path}",
]
logger.debug(f"Rendering: {' '.join(docker_cmd)}")
try:
result = subprocess.run(docker_cmd, capture_output=True, text=True, check=True)
logger.debug(f"Successfully rendered {app_manifest.name} with {test_values_filename}")
if result.stdout:
logger.debug(f"Render output: {result.stdout}")
except subprocess.CalledProcessError as e:
logger.error(f"Failed to render {app_manifest.name}/{test_values_filename}")
logger.error(f"Docker error: {e.stderr}")
raise RuntimeError(f"Rendering failed for {app_manifest.name}") from e
# Read rendered compose file
compose_path = app_manifest.path / Config.RENDERED_COMPOSE_PATH
if not compose_path.exists():
raise FileNotFoundError(f"Rendered compose file not found: {compose_path}")
try:
self._fix_file_permissions(compose_path)
with open(compose_path, "r") as f:
data = yaml.safe_load(f)
# Ensure we have a dict
if not isinstance(data, dict):
raise ValueError(f"YAML file {compose_path} must contain a dictionary at root level, got {type(data)}")
return data
except yaml.YAMLError as e:
raise RuntimeError(f"Failed to parse rendered compose: {compose_path}") from e
def _fix_file_permissions(self, file_path: Path) -> None:
"""Fix file permissions using Docker container."""
logger.debug(f"Fixing permissions for {file_path}")
docker_cmd = [
"docker",
"run",
f"--platform={self.platform}",
"--quiet",
"--rm",
"-e FAKE_ENV=1",
f"-v={os.getcwd()}:/workspace",
"--entrypoint=/bin/bash",
self.container_image,
"-c",
f"chmod 777 /workspace/{file_path}",
]
result = subprocess.run(docker_cmd, capture_output=True, text=True)
if result.returncode != 0:
logger.error(f"Failed to fix permissions for {file_path}")
logger.error(result.stderr)
raise RuntimeError(f"Permission fix failed for {file_path}")
class DockerComposeAnalyzer:
"""Analyzes Docker Compose configurations for service capabilities."""
@staticmethod
def extract_service_names(compose_data: Dict, include_short_lived: bool = False) -> List[str]:
"""Extract service names from compose data, optionally including short-lived services."""
services = compose_data.get("services", {})
if not services:
raise ValueError("No services found in compose data")
service_names = []
for service_name, service_config in services.items():
if not include_short_lived:
restart_policy = service_config.get("restart", "")
if restart_policy.startswith("on-failure"):
logger.debug(f"Skipping short-lived service: {service_name}")
continue
service_names.append(service_name)
return service_names
@staticmethod
def extract_capabilities_by_service(compose_data: Dict) -> Dict[str, Set[str]]:
"""Extract capabilities grouped by service from compose data."""
services = compose_data.get("services", {})
if not services:
raise ValueError("No services found in compose data")
service_capabilities = {}
for service_name, service_config in services.items():
restart_policy = service_config.get("restart", "")
# Skip services without restart policy
if not restart_policy:
logger.warning(f"No restart policy for service: {service_name}")
continue
# Skip short-lived services
if restart_policy.startswith("on-failure"):
logger.debug(f"Skipping short-lived service: {service_name}")
continue
# Validate cap_drop configuration
if "cap_drop" not in service_config:
logger.error(
f"No cap_drop for service: {service_name}. Consider explicitly setting the defaults via cap_add "
"https://github.com/moby/moby/blob/7a0bf747f5c25da0794e42d5f9e5a40db5a7786e/oci/caps/defaults.go#L4"
)
elif service_config["cap_drop"] != ["ALL"]:
logger.error(f"Non-standard cap_drop for service: {service_name}")
# Extract capabilities
if "cap_add" in service_config:
capabilities = set(service_config["cap_add"])
if capabilities:
service_capabilities[service_name] = capabilities
logger.debug(f"Service {service_name} capabilities: {capabilities}")
return service_capabilities
@staticmethod
def extract_user_by_service(compose_data: Dict) -> Dict[str, Tuple[int, int]]:
"""Extract user directive grouped by service from compose data.
Returns a dict mapping service name to (uid, gid) tuple.
Expects format "uid:gid". Defaults to (0, 0) for root if not specified."""
services = compose_data.get("services", {})
if not services:
raise ValueError("No services found in compose data")
service_users = {}
for service_name, service_config in services.items():
restart_policy = service_config.get("restart", "")
# Skip services without restart policy
if not restart_policy:
logger.warning(f"No restart policy for service: {service_name}")
continue
# Skip short-lived services
if restart_policy.startswith("on-failure"):
logger.debug(f"Skipping short-lived service: {service_name}")
continue
# Extract user directive, default to "0:0" (root) if not present
user_directive = service_config.get("user", "0:0")
# Parse user directive (format must be "uid:gid")
if isinstance(user_directive, str):
if ":" not in user_directive:
raise ValueError(
f"Service {service_name} has invalid user directive format: {user_directive}. "
f"Expected format is 'uid:gid'"
)
parts = user_directive.split(":")
if len(parts) != 2:
raise ValueError(
f"Service {service_name} has invalid user directive format: {user_directive}. "
f"Expected format is 'uid:gid'"
)
uid_part, gid_part = parts
try:
uid = int(uid_part)
gid = int(gid_part)
except ValueError:
raise ValueError(
f"Service {service_name} has non-numeric user directive: {user_directive}. "
f"Both uid and gid must be numeric"
)
else:
raise ValueError(
f"Service {service_name} has unexpected user directive type: {type(user_directive)}. "
f"Expected string format 'uid:gid'"
)
service_users[service_name] = (uid, gid)
logger.debug(f"Service {service_name} user: {uid}:{gid}")
return service_users
class AppQuestionsValidator:
"""Validates app questions configuration against actual services."""
def __init__(self, file_cache: FileSystemCache):
self.file_cache = file_cache
def validate_question(self, question: Dict) -> None:
"""Validate a single question configuration."""
if "variable" not in question:
raise ValueError("Question missing variable field")
variable_name = question["variable"]
if variable_name == "TZ":
return
if variable_name not in [
"storageEntry",
"publicIpDnsProviderEntry",
"jenkinsJavaOpt",
"jenkinsOption",
"aspellDict",
"trustedProxy",
"extraParam",
]:
if not re.match(Config.RE_VAR_NAME, variable_name):
raise ValueError(f"Invalid variable name: {variable_name}")
schema = question["schema"]
schema_type = schema["type"]
if schema_type == "dict":
for attr in schema["attrs"]:
self.validate_question(attr)
elif schema_type == "list":
if "min_length" in schema:
raise ValueError(f"List schema with min_length not supported, use min: {schema}")
for item in schema["items"]:
self.validate_question(item)
def validate_variable_names(self, app_manifest: AppManifest) -> None:
"""Validate that variable names in questions match service names."""
questions_path = app_manifest.path / Config.QUESTIONS_FILE
if not questions_path.exists():
raise FileNotFoundError(f"Questions file not found: {questions_path}")
questions_config = self.file_cache.read_yaml_file(questions_path)
if not isinstance(questions_config, dict):
raise ValueError(f"Invalid questions config in {questions_path}")
for question in questions_config.get("questions", []):
self.validate_question(question)
def validate_container_labels_section(self, app_manifest: AppManifest, service_names: List[str]) -> None:
"""Validate that container labels section matches actual service names."""
questions_path = app_manifest.path / Config.QUESTIONS_FILE
if not questions_path.exists():
raise FileNotFoundError(f"Questions file not found: {questions_path}")
questions_config = self.file_cache.read_yaml_file(questions_path)
if not isinstance(questions_config, dict):
raise ValueError(f"Invalid questions config in {questions_path}")
new_enum = [{"value": name, "description": name} for name in service_names]
def check_containers_enum(enum_item, section_name):
old_enum = enum_item["schema"]["enum"]
old_values = {item["value"] for item in old_enum}
new_values = {item["value"] for item in new_enum}
if old_values != new_values:
raise ValueError(
f"Container {section_name} section should have {sorted(new_values)} "
f"but has {sorted(old_values)}"
)
def check_labels():
# Find the labels question and validate containers enum
for question in questions_config.get("questions", []):
# Find the questions{}.labels[{}] question
if question.get("variable") != "labels":
continue
# questions.labels
for attr in question["schema"]["items"][0]["schema"]["attrs"]:
# Find the questions{}.labels[{}].containers[str] question
if attr.get("variable") != "containers":
continue
# questions.labels.containers
enum_item = attr["schema"]["items"][0]
check_containers_enum(enum_item, "labels")
return
def check_network():
# Find the network question and validate containers enum
for question in questions_config.get("questions", []):
# Find the questions{}.network{} question
if question.get("variable") != "network":
continue
for item in question["schema"]["attrs"]:
# Find the questions{}.network{}.networks[{}] question
if item.get("variable") != "networks":
continue
for attr in item["schema"]["items"][0]["schema"]["attrs"]:
# Find the questions{}.network{}.networks[{}].containers[{}] question
if attr.get("variable") != "containers":
continue
for attr_item in attr["schema"]["items"][0]["schema"]["attrs"]:
# Find the questions{}.network{}.networks[{}].containers[{}].name question
if attr_item.get("variable") != "name":
continue
check_containers_enum(attr_item, "network.networks.containers.name")
return
check_labels()
check_network()
class AppVersionManager:
"""Manages app version information and updates."""
def __init__(self, file_cache: FileSystemCache, should_bump_versions: bool = True):
self.file_cache = file_cache
self.should_bump_versions = should_bump_versions
def get_current_app_version(self, app_manifest: AppManifest) -> str:
"""Get the current app version from appropriate source."""
# Special case for ix-app
if str(app_manifest.path) == f"{Config.APPS_ROOT_DIR}/stable/ix-app":
app_config = self.file_cache.read_yaml_file(app_manifest.path / Config.APP_METADATA_FILE)
return app_config["version"]
# Regular apps use ix_values.yaml
values_path = app_manifest.path / Config.APP_VALUES_FILE
if not values_path.exists():
raise FileNotFoundError(f"App values file not found: {values_path}")
values_config = self.file_cache.read_yaml_file(values_path)
return values_config["images"]["image"]["tag"]
def increment_patch_version(self, version: str) -> str:
"""Increment the patch version number."""
if not self.should_bump_versions:
return version
try:
parts = version.split(".")
if len(parts) != 3:
raise ValueError("Version must be in format x.y.z")
parts[2] = str(int(parts[2]) + 1)
return ".".join(parts)
except (ValueError, IndexError) as e:
raise ValueError(f"Invalid version format: {version}") from e
class AppMetadataUpdater:
"""Updates app metadata files with capability information."""
def __init__(self, file_cache: FileSystemCache, version_manager: AppVersionManager):
self.file_cache = file_cache
self.version_manager = version_manager
@staticmethod
def create_run_as_context(service_users: Dict[str, Tuple[int, int]]) -> List[Dict[str, Any]]:
"""Create run_as_context list based on service user values."""
run_as_context = []
for service_name, (uid, gid) in sorted(service_users.items()):
# Determine user type
if uid == 0:
user_type = "root user"
elif uid == 568:
user_type = "any non-root user"
else:
user_type = "non-root user"
# Determine group type
if gid == 0:
group_type = "root group"
elif gid == 568:
group_type = "any non-root group"
else:
group_type = "non-root group"
# Create description
if uid == 0 and gid == 0:
description = f"Container [{service_name}] runs as root user and group."
elif uid == 568 and gid == 568:
description = f"Container [{service_name}] can run as any non-root user and group."
elif uid != 0 and uid != 568 and gid != 0 and gid != 568:
description = f"Container [{service_name}] runs as non-root user and group."
elif uid == 568:
description = f"Container [{service_name}] can run as any non-root user and {group_type}."
elif gid == 568:
description = f"Container [{service_name}] runs as {user_type} and any non-root group."
else:
description = f"Container [{service_name}] runs as {user_type} and {group_type}."
context = {
"description": description,
"gid": gid,
"group_name": DockerCapabilityRegistry.gid_to_group_name(gid),
"uid": uid,
"user_name": DockerCapabilityRegistry.uid_to_user_name(uid),
}
run_as_context.append(context)
return run_as_context
def update_app_metadata(
self,
app_manifest: AppManifest,
capabilities: List[DockerCapability],
current_app_version: str,
service_users: Dict[str, Tuple[int, int]],
should_bump_version: bool = True,
) -> None:
"""Update app.yaml with new capabilities, run_as_context, and version information."""
app_metadata_path = app_manifest.path / Config.APP_METADATA_FILE
app_config = self.file_cache.read_yaml_file(app_metadata_path)
if not isinstance(app_config, dict):
raise ValueError(f"Invalid app config in {app_metadata_path}")
# Validate app configuration (warnings only)
self._validate_app_configuration(app_manifest, app_config)
# Check if update is needed
needs_version_bump = False
# Update app version if changed
old_app_version = app_config.get("app_version", "")
# If the old app version is a substring of the current version, keep it
# Example new version is 1.2.3-debian and app_version is 1.2.3. This is fine.
if old_app_version in current_app_version:
current_app_version = old_app_version
if current_app_version != old_app_version:
needs_version_bump = True
app_config["app_version"] = current_app_version
# Update capabilities if changed
new_capabilities_data = sorted([cap.to_dict() for cap in capabilities], key=lambda c: c["name"])
old_capabilities_data = sorted(app_config.get("capabilities", []), key=lambda c: c["name"])
if old_capabilities_data != new_capabilities_data:
needs_version_bump = True
app_config["capabilities"] = new_capabilities_data
# Update run_as_context if changed
new_run_as_context = self.create_run_as_context(service_users)
old_run_as_context = app_config.get("run_as_context", [])
if old_run_as_context != new_run_as_context:
needs_version_bump = True
app_config["run_as_context"] = new_run_as_context
new_maintainers = [{"email": "dev@truenas.com", "name": "truenas", "url": "https://www.truenas.com/"}]
if app_config.get("maintainers", []) != new_maintainers:
app_config["maintainers"] = new_maintainers
needs_version_bump = True
# Bump version if needed
if needs_version_bump and should_bump_version:
old_version = app_config["version"]
new_version = self.version_manager.increment_patch_version(old_version)
app_config["version"] = new_version
logger.info(f"Updated {app_manifest.name} version: {old_version} → {new_version}")
# Write updated configuration
self.file_cache.write_yaml_file(app_metadata_path, app_config)
def _validate_app_configuration(self, app_manifest: AppManifest, app_config: Dict) -> None:
"""Validate app configuration and log warnings for issues."""
app_name = app_config.get("name", app_manifest.name)
# Check for multiple categories
categories = app_config.get("categories", [])
if len(categories) > 1:
raise ValueError(
f"{app_manifest.name}: app.yaml must have exactly 1 category, found {len(categories)}: {categories}"
)
# Check for missing fields
if "date_added" not in app_config:
logger.warning(f"{app_manifest.name}: missing date_added")
if "changelog_url" not in app_config:
logger.warning(f"{app_manifest.name}: missing changelog_url")
# Validate media URLs
expected_base_url = "https://media.sys.truenas.net/apps"
app_expected_base_url = f"{expected_base_url}/{app_name}"
icon_url = app_config.get("icon", "")
if not icon_url.startswith(expected_base_url):
logger.error(f"{app_manifest.name}: invalid icon URL: {icon_url}. Must use {expected_base_url} as base")
sys.exit(1)
if not icon_url.startswith(f"{app_expected_base_url}/icons/"):
logger.warning(f"{app_manifest.name}: invalid icon URL: {icon_url}")
for ss_url in app_config.get("screenshots", []):
if not ss_url.startswith(expected_base_url):
logger.error(
f"{app_manifest.name}: invalid screenshot URL: {ss_url}. Must use {expected_base_url} as base"
)
sys.exit(1)
if not ss_url.startswith(f"{app_expected_base_url}/screenshots/"):
logger.warning(f"{app_manifest.name}: invalid screenshot URL: {ss_url}")
class TrueNASAppCapabilityManager:
"""Main orchestrator for TrueNAS app capability management."""
def __init__(self, should_bump_versions: bool = True):
self.should_bump_versions = should_bump_versions
self.file_cache = FileSystemCache()
self.discovery_service = AppDiscoveryService()
self.compose_renderer = DockerComposeRenderer()
self.compose_analyzer = DockerComposeAnalyzer()
self.questions_validator = AppQuestionsValidator(self.file_cache)
self.version_manager = AppVersionManager(self.file_cache, should_bump_versions)
self.metadata_updater = AppMetadataUpdater(self.file_cache, self.version_manager)
self.capability_registry = DockerCapabilityRegistry()
def analyze_single_app(self, app_manifest: AppManifest) -> AppAnalysisResult:
"""Analyze a single app across all its test configurations."""
if not app_manifest.test_value_files:
logger.warning(f"No test configurations for {app_manifest.name}")
return AppAnalysisResult([], [], "", {})
# Extract app title from app.yaml
app_metadata_path = app_manifest.path / Config.APP_METADATA_FILE
app_config = self.file_cache.read_yaml_file(app_metadata_path)
if not isinstance(app_config, dict):
raise ValueError(f"Invalid app config in {app_metadata_path}")
app_title = app_config.get("title", app_manifest.name)
# Track capabilities across all test configurations
capability_to_services: Dict[str, Set[str]] = {}
all_service_names = set()
# Track user values: service_name -> list of (uid, gid) tuples from all test configs
service_user_values: Dict[str, List[Tuple[int, int]]] = {}
for test_values_file in app_manifest.test_value_files:
logger.debug(f"Processing {app_manifest.name} with {test_values_file}")
try:
# Render app with test configuration
compose_data = self.compose_renderer.render_app_with_values(app_manifest, test_values_file)
# Extract service information
service_names = self.compose_analyzer.extract_service_names(compose_data)
all_service_names.update(service_names)
# Extract capabilities by service
service_capabilities = self.compose_analyzer.extract_capabilities_by_service(compose_data)
# Aggregate capabilities
for service_name, capabilities in service_capabilities.items():
for capability in capabilities:
if capability not in capability_to_services:
capability_to_services[capability] = set()
capability_to_services[capability].add(service_name)
# Extract user directives by service
service_users = self.compose_analyzer.extract_user_by_service(compose_data)
for service_name, (uid, gid) in service_users.items():
if service_name not in service_user_values:
service_user_values[service_name] = []
service_user_values[service_name].append((uid, gid))
except Exception as e:
logger.error(f"Failed to process {app_manifest.name}/{test_values_file}: {e}")
raise
# Convert to DockerCapability objects
capabilities = []
for capability_name, services in capability_to_services.items():
try:
description = self.capability_registry.create_capability_description(
capability_name, sorted(services), app_title
)
capabilities.append(DockerCapability(capability_name, description))
except ValueError as e:
logger.error(f"Failed to create capability description: {e}")
continue
# Determine final user for each service based on all test configurations
final_service_users = {}
for service_name, user_values in service_user_values.items():
uids = [uid for uid, _ in user_values]
gids = [gid for _, gid in user_values]
# If at least one test value has user 0 (root) or group 0 (root), the service runs as root
if 0 in uids or 0 in gids:
# Prefer entry with both uid=0 and gid=0
root_entry = None
for uid, gid in user_values:
if uid == 0 and gid == 0:
root_entry = (uid, gid)
break
# If no (0,0), find entry with uid=0
if root_entry is None:
for uid, gid in user_values:
if uid == 0:
root_entry = (uid, gid)
break
# If no uid=0, find entry with gid=0
if root_entry is None:
for uid, gid in user_values:
if gid == 0:
root_entry = (uid, gid)
break
final_service_users[service_name] = root_entry
# If all test values have the same non-root user, use that
elif len(set(user_values)) == 1:
final_service_users[service_name] = user_values[0]
# If test values have different non-root users, use the first one
# (this shouldn't normally happen, but we handle it)
else:
logger.warning(
f"Service {service_name} has inconsistent user values: {user_values}, using {user_values[0]}"
)
final_service_users[service_name] = user_values[0]
# Get current app version
current_version = self.version_manager.get_current_app_version(app_manifest)
return AppAnalysisResult(
capabilities=sorted(capabilities, key=lambda c: c.name),
service_names=sorted(all_service_names),
app_version=str(current_version),
service_users=final_service_users,
)
def update_single_app(self, app_manifest: AppManifest) -> None:
"""Update capabilities and metadata for a single app."""
logger.debug(f"Updating capabilities for {app_manifest.name}")
try:
# Analyze the app
analysis_result = self.analyze_single_app(app_manifest)
# Validate variable names in questions
self.questions_validator.validate_variable_names(app_manifest)
# Validate questions configuration
self.questions_validator.validate_container_labels_section(app_manifest, analysis_result.service_names)
# Update metadata
self.metadata_updater.update_app_metadata(
app_manifest,
analysis_result.capabilities,
analysis_result.app_version,
analysis_result.service_users,
self.should_bump_versions,
)
logger.info(
f"Successfully updated {app_manifest.name} with "
f"{len(analysis_result.capabilities)} capabilities and "
f"{len(analysis_result.service_users)} services"
)
except Exception as e:
logger.error(f"Failed to update {app_manifest.name}: {e}")
raise
def update_all_apps(self) -> None:
"""Update capabilities for all discovered apps."""
app_manifests = self.discovery_service.discover_all_apps()
if not app_manifests:
logger.warning("No apps found to process")
return
success_count = 0
failed_count = 0
for app_manifest in app_manifests:
try:
self.update_single_app(app_manifest)
success_count += 1
except Exception as e:
logger.error(f"Skipping {app_manifest.name}: {e}")
failed_count += 1
continue
logger.info(f"Successfully processed {success_count}/{len(app_manifests)} apps")
if failed_count > 0:
logger.error(f"Failed to process {failed_count} apps")
sys.exit(1)
def update_specific_app(self, train_name: str, app_name: str) -> None:
"""Update capabilities for a specific app."""
app_manifest = self.discovery_service.discover_single_app(train_name, app_name)
if not app_manifest:
logger.error(f"App {train_name}/{app_name} not found")
sys.exit(1)
self.update_single_app(app_manifest)
def parse_command_line_arguments() -> argparse.Namespace:
"""Parse and return command line arguments."""
parser = argparse.ArgumentParser(
description="TrueNAS Apps Capability Manager - Analyze and update app capabilities"
)
parser.add_argument("--train", help="Specific train name to process")
parser.add_argument("--app", help="Specific app name to process (requires --train)")
parser.add_argument("--no-bump", action="store_true", help="Skip version bumping when updating metadata")
return parser.parse_args()
def main():
"""Main application entry point."""
try:
args = parse_command_line_arguments()
# Initialize the capability manager
capability_manager = TrueNASAppCapabilityManager(should_bump_versions=not args.no_bump)
# Determine operation mode
if args.train and args.app:
# Update specific app
capability_manager.update_specific_app(args.train, args.app)
elif args.train or args.app:
# Invalid: both train and app must be provided together
logger.error("Both --train and --app must be provided together, or neither")
sys.exit(1)
else:
# Update all apps
capability_manager.update_all_apps()
except KeyboardInterrupt:
logger.info("Operation cancelled by user")
sys.exit(1)
except Exception as e:
logger.error(f"Unexpected error: {e}")
sys.exit(1)
if __name__ == "__main__":
main()
================================================
FILE: .github/scripts/message.py
================================================
import sys
import json
def get_files_from_file(file: str):
with open(file, "r") as f:
json_files = f.read()
try:
return json.loads(json_files.replace("\\", ""))
except json.JSONDecodeError:
print(f"Failed to decode JSON from {file}", file=sys.stderr)
exit(1)
trains_to_check = ["test", "stable", "enterprise"]
account_to_notify = ["@truenas/docs-team"]
def process(changed_files: list[str] | None = None, added_files: list[str] | None = None):
changed_files = changed_files or []
added_files = added_files or []
changes = {}
for file in changed_files:
if not file.startswith("ix-dev/"):
continue
train = file.split("/")[1]
if train not in trains_to_check:
continue
app = file.split("/")[2]
if file.startswith(f"ix-dev/{train}/{app}/templates/library/base_"):
continue
if train not in changes:
changes[train] = {"apps": {}}
if app not in changes[train]["apps"]:
changes[train]["apps"][app] = {"areas": set([]), "added": set([]), "modified": set([])}
trimmed_file_name = file.replace(f"ix-dev/{train}/{app}/", "")
if file in added_files:
changes[train]["apps"][app]["added"].add(trimmed_file_name)
else:
changes[train]["apps"][app]["modified"].add(trimmed_file_name)
if file.endswith("questions.yaml"):
changes[train]["apps"][app]["areas"].add("ui")
elif file.endswith("app.yaml"):
changes[train]["apps"][app]["areas"].add("metadata")
elif file.endswith("docker-compose.yaml"):
changes[train]["apps"][app]["areas"].add("template")
elif file.endswith("ix_values.yaml"):
changes[train]["apps"][app]["areas"].add("static_config")
return generate_message(changes)
def generate_message(changes: dict | None = None):
changes = changes or {}
message = ""
for train in sorted(changes):
message += f"## `{train.title()}`\n\n"
for app in sorted(changes[train]["apps"]):
message += f"### `{app.title()}`\n"
if len(changes[train]["apps"][app]["areas"]) > 0:
fmt_areas = [f"`{a}`" for a in changes[train]["apps"][app]["areas"]]
message += f"Affected areas: {', '.join(fmt_areas)}\n"
if len(changes[train]["apps"][app]["added"]) > 0:
message += "Added files:\n"
for file in sorted(changes[train]["apps"][app]["added"]):
message += f"- `{file}`\n"
message += "\n"
if len(changes[train]["apps"][app]["modified"]) > 0:
message += "Modified files:\n"
for file in sorted(changes[train]["apps"][app]["modified"]):
message += f"- `{file}`\n"
message += "\n"
message += "\n---\n\n"
if message:
message += "Notifying the following about changes to the trains:\n"
message += ", ".join(account_to_notify)
return message
ALL_CHANGED_FILE = ".github/outputs/all_changed_files.json"
ADDED_FILE = ".github/outputs/added_files.json"
def main():
changed_files = get_files_from_file(ALL_CHANGED_FILE)
added_files = get_files_from_file(ADDED_FILE)
print(process(changed_files, added_files))
if __name__ == "__main__":
main()
================================================
FILE: .github/scripts/port_validation.py
================================================
#!/usr/bin/python3
# /// script
# requires-python = ">=3.11"
# dependencies = [
# "pyyaml",
# ]
# ///
import sys
import yaml
from collections import defaultdict
from os import scandir
def extract_ports_from_items(items):
ports = []
for item in items:
if not item_looks_like_port(item):
continue
ports.append({"name": item["variable"], "port": item["schema"]["default"]})
return ports
def item_looks_like_port(item):
schema = item["schema"]
if schema["type"] != "int":
return False
if schema.get("min", 0) != 1:
return False
if schema.get("max", 0) != 65535:
return False
if not schema.get("default"):
return False
return True
def dict_looks_like_port(attrs):
for var in attrs:
if var["variable"] == "host_ips":
return True
return False
def extract_ports(quests):
ports = []
for quest in quests:
port_name = None
schema = quest["schema"]
if quest["variable"].endswith("_port"):
port_name = quest["variable"]
start_idx = len(ports) # Track starting point
if schema["type"] == "dict":
if dict_looks_like_port(schema["attrs"]):
ports.extend(extract_ports_from_items(schema["attrs"]))
else:
ports.extend(extract_ports(schema["attrs"]))
elif schema["type"] == "list":
ports.extend(extract_ports(schema["items"]))
if port_name:
for port in ports[start_idx:]: # Only new ports
port["name"] = port_name
return ports
def scan_directory(path: str, current_depth: int = 0, to_depth: int = 2):
"""Iterate over `path` to depth level `to_depth`
and yield any file paths at that level."""
if current_depth > to_depth:
return
with scandir(path) as sdir:
for entry in sdir:
if current_depth == to_depth and entry.is_file():
yield entry.path
elif (current_depth < to_depth) and entry.is_dir():
yield from scan_directory(entry.path, current_depth + 1)
def get_current_port_map():
port_map = defaultdict(list)
ignore_ports = (53, 22000)
dupe_found = False
port_docs = []
for path in filter(lambda x: x.endswith("questions.yaml"), scan_directory("ix-dev")):
with open(path) as f:
parts = path.split("/")
app_info = f"{parts[-3]}/{parts[-2]}"
for item in extract_ports(yaml.load(f, Loader=yaml.FullLoader)["questions"]):
app_port, port_name = item["port"], item["name"]
port_map[app_port].append(f"{app_info} ({port_name})")
port_docs.append((app_info, port_name, app_port))
if len(port_map[app_port]) > 1 and app_port not in ignore_ports:
dupe_found = True
dup_apps = ", ".join(port_map[app_port])
print(f"Duplicate port [{app_port}] in apps: {dup_apps}")
return port_map, dupe_found, port_docs
def main():
start_range, max_range = 30000, 40000
port_map, dupe_found, port_docs = get_current_port_map()
next_5_avail_ports = sorted(list(set(range(start_range, max_range + 1)) - set(port_map)))[:5]
print(f"Next 5 available ports: [{', '.join([str(x) for x in next_5_avail_ports])}]")
if dupe_found:
print("Duplicate ports found, please use one of the available ports.")
sys.exit(1)
if len(sys.argv) > 1 and sys.argv[1] == "docs":
print("Ports with documentation:")
for app_info, port_name, app_port in port_docs:
print(f"{app_info},{port_name},{app_port}")
if __name__ == "__main__":
main()
================================================
FILE: .github/scripts/renovate_bump.sh
================================================
#!/bin/bash
app_path=$1
update_type=$2
dep_name=$3
dep_version=$4
base_branch=$5
if [[ -z "$base_branch" ]]; then
echo "Missing base_branch"
exit 1
fi
# We keep a distinct log for each base branch
# This makes sure an app that is on multiple branches gets updated on each branch
# Sanitize base_branch to remove characters that are invalid in filenames
sanitized_branch="${base_branch//\//-}"
log_path="/tmp/renovate-${sanitized_branch}.log"
if [ ! -f "$log_path" ]; then
touch "$log_path"
fi
if [[ -z "$app_path" ]]; then
echo "Missing app_path"
exit 1
fi
if [[ -z "$update_type" ]]; then
echo "Missing update_type"
exit 1
fi
if grep -Fx "$app_path" "$log_path"; then
update_type=""
fi
docker run --quiet --rm \
--platform linux/amd64 \
-v ./:/workspace \
-e FAKE_ENV=1 \
ghcr.io/truenas/apps_validation:latest app_bump_version \
--path /workspace/"$app_path" \
--bump "$update_type" \
--dep-name "$dep_name" \
--dep-version "$dep_version"
echo "$app_path" >>"$log_path"
================================================
FILE: .github/workflows/app-test-suite.yaml
================================================
name: Apps Test Suite
on:
pull_request: {}
jobs:
changed-files:
name: Generate matrix
runs-on: ubuntu-latest
outputs:
changed-apps-1: ${{ steps.changed-apps.outputs.changed-apps-1 }}
change-count-1: ${{ steps.changed-apps.outputs.change-count-1 }}
changed-apps-2: ${{ steps.changed-apps.outputs.changed-apps-2 }}
change-count-2: ${{ steps.changed-apps.outputs.change-count-2 }}
changed-apps-3: ${{ steps.changed-apps.outputs.changed-apps-3 }}
change-count-3: ${{ steps.changed-apps.outputs.change-count-3 }}
steps:
- name: Check Docker socket ownership
run: |
ls -la /var/run/docker.sock
gid=$(stat -c '%g' /var/run/docker.sock)
echo "Docker socket group is [$gid]"
# Some apps that run rootless, we add this group to their compose file when in CI
# So those apps can connect to the Docker socket, if that changes, we need to update
# the app's compose file to use the correct group
[ $gid -eq 118 ] && exit 0
echo "Expected Docker socket group to be 118, but it's [$gid]"
exit 1
- name: Checkout
uses: actions/checkout@v6
- name: Get changed files
id: changed-files-json
uses: tj-actions/changed-files@v47
with:
json: true
write_output_files: true
- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: "3.14"
- name: Matrix Output
id: changed-apps
run: |
out=$(python3 .github/scripts/changed_apps.py)
echo "changed-apps-1=$(echo "${out}" | jq -cr '.matrix1')" >> $GITHUB_OUTPUT
echo "changed-apps-2=$(echo "${out}" | jq -cr '.matrix2')" >> $GITHUB_OUTPUT
echo "changed-apps-3=$(echo "${out}" | jq -cr '.matrix3')" >> $GITHUB_OUTPUT
echo "change-count-1=$(echo "${out}" | jq -cr '.matrix1.include | length')" >> $GITHUB_OUTPUT
echo "change-count-2=$(echo "${out}" | jq -cr '.matrix2.include | length')" >> $GITHUB_OUTPUT
echo "change-count-3=$(echo "${out}" | jq -cr '.matrix3.include | length')" >> $GITHUB_OUTPUT
- name: Message Generation
id: message
run: |
python3 .github/scripts/message.py > pr-comment.txt
if [ "$(cat pr-comment.txt)" != "" ]; then
echo "message=true" >> $GITHUB_OUTPUT
else
echo "message=false" >> $GITHUB_OUTPUT
fi
- name: Comment PR
uses: thollander/actions-comment-pull-request@v3
if: steps.message.outputs.message == 'true'
continue-on-error: true
with:
comment-tag: notify-teams
file-path: pr-comment.txt
run-apps-matrix-1:
name: Run Docker Compose Render/Install (Matrix 1)
needs: changed-files
runs-on: ubuntu-latest
if: needs.changed-files.outputs.change-count-1 > 0
strategy:
matrix: ${{ fromJson(needs.changed-files.outputs.changed-apps-1) }}
fail-fast: false
max-parallel: 20
steps:
- name: Environment Information
run: |
echo "====== Docker Info ======"
docker info
echo "========================="
- name: Checkout
uses: actions/checkout@v6
- name: Test
shell: bash
run: |
echo "Testing [${{matrix.train}}/${{matrix.app}}/templates/test_values/${{matrix.test_file}}]"
python3 ./.github/scripts/ci.py --train ${{matrix.train}} --app ${{matrix.app}} --test-file ${{matrix.test_file}}
- name: Check Metadata
shell: bash
run: |
echo "Checking [${{matrix.train}}/${{matrix.app}}/app.yaml]"
curr_diff=$(git diff)
python3 ./.github/scripts/generate_metadata.py --train ${{matrix.train}} --app ${{matrix.app}}
new_diff=$(git diff)
if [ "$curr_diff" != "$new_diff" ]; then
git diff
echo "App metadata is not up to date"
echo "Please run [python3 ./.github/scripts/generate_metadata.py --train ${{matrix.train}} --app ${{matrix.app}}] and commit the changes"
exit 1
fi
run-apps-matrix-2:
name: Run Docker Compose Render/Install (Matrix 2)
needs: changed-files
runs-on: ubuntu-latest
if: needs.changed-files.outputs.change-count-2 > 0
strategy:
matrix: ${{ fromJson(needs.changed-files.outputs.changed-apps-2) }}
fail-fast: false
max-parallel: 20
steps:
- name: Environment Information
run: |
echo "====== Docker Info ======"
docker info
echo "========================="
- name: Checkout
uses: actions/checkout@v6
- name: Test
shell: bash
run: |
echo "Testing [${{matrix.train}}/${{matrix.app}}/templates/test_values/${{matrix.test_file}}]"
python3 ./.github/scripts/ci.py --train ${{matrix.train}} --app ${{matrix.app}} --test-file ${{matrix.test_file}}
run-apps-matrix-3:
name: Run Docker Compose Render/Install (Matrix 3)
needs: changed-files
runs-on: ubuntu-latest
if: needs.changed-files.outputs.change-count-3 > 0
strategy:
matrix: ${{ fromJson(needs.changed-files.outputs.changed-apps-3) }}
fail-fast: false
max-parallel: 20
steps:
- name: Environment Information
run: |
echo "====== Docker Info ======"
docker info
echo "========================="
- name: Checkout
uses: actions/checkout@v6
- name: Test
shell: bash
run: |
echo "Testing [${{matrix.train}}/${{matrix.app}}/templates/test_values/${{matrix.test_file}}]"
python3 ./.github/scripts/ci.py --train ${{matrix.train}} --app ${{matrix.app}} --test-file ${{matrix.test_file}}
================================================
FILE: .github/workflows/dev_apps_validate.yml
================================================
name: dev_catalog_validation
on:
push:
pull_request:
workflow_dispatch:
jobs:
ix-dev-validate:
runs-on: ubuntu-latest
container:
image: ghcr.io/truenas/apps_validation:latest
env:
FAKE_ENV: 1
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Adding git directory to safe path
run: git config --global --add safe.directory "$(pwd)"
- name: Fetch base branch history
run: git fetch -u origin master:master
- name: validate dev catalog
run: /bin/bash -c "/usr/local/bin/apps_dev_charts_validate validate --path $(pwd)"
- name: Validate Ports
run: ./.github/scripts/port_validation.py
================================================
FILE: .github/workflows/library-tests.yaml
================================================
name: Unit Tests
on:
pull_request:
paths:
- "library/**"
jobs:
run-unit-test:
name: Run Unit Tests
runs-on: ubuntu-latest
container: python:3.14-slim
steps:
- name: Checkout Code
uses: actions/checkout@v6
- name: Install dependencies
run: |
apt update
apt install -y \
python3-yaml \
python3-bcrypt \
python3-docker \
python3-pytest \
python3-pytest-mock
- name: Run Tests
run: |
pytest library
================================================
FILE: .github/workflows/python-lint.yaml
================================================
name: flake8
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Set up Python 3.11
uses: actions/setup-python@v6
with:
python-version: 3.14
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install flake8
- name: Analysing the code with flake8
run: flake8 .
================================================
FILE: .github/workflows/renovate.yaml
================================================
name: Renovate
on:
workflow_dispatch:
schedule:
- cron: "0 12 * * *"
concurrency:
group: renovate
cancel-in-progress: false
env:
RENOVATE_CACHE_DIR: /tmp/renovate/cache
jobs:
renovate:
runs-on: ubuntu-latest
steps:
# https://github.com/kou/arrow/blob/main/ci/scripts/util_free_space.sh
- name: Free Disk Space
shell: bash
run: |
items=(
/usr/local/lib/android # ~15GB
/opt/hostedtoolcache/CodeQL # ~5GB
)
echo "Before cleanup:"
df -h /
for item in "${items[@]}"; do
echo "Processing $item"
if [ ! -e "$item" ]; then
continue
fi
sudo rm -rf "$item" || :
echo "After cleanup of $item:"
df -h /
done
echo "After cleanup:"
df -h /
- name: Checkout
uses: actions/checkout@v6
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Restore Renovate Cache
uses: actions/cache/restore@v5
with:
path: ${{ env.RENOVATE_CACHE_DIR }}
key: renovate-${{ github.run_id }}
restore-keys: |
renovate-
- name: Pre Pull Docker Image
run: |
docker pull ghcr.io/truenas/apps_validation:latest
- name: Fix Cache Permissions
run: |
set -x
sudo mkdir -p "$RENOVATE_CACHE_DIR"
sudo chown -R 12021:0 $(dirname "$RENOVATE_CACHE_DIR")
- name: Self-hosted Renovate
uses: renovatebot/github-action@v46.1.12
env:
RENOVATE_PR_HOURLY_LIMIT: 10
LOG_LEVEL: debug
with:
configurationFile: .github/renovate-config.js
# TODO: https://github.com/renovatebot/github-action/tree/main?tab=readme-ov-file
token: ${{ secrets.RENOVATE_TOKEN }}
mount-docker-socket: true
- name: Save Renovate Cache
uses: actions/cache/save@v5
if: always()
with:
# Caches that don't get accessed for the last 7 days are deleted
# https://github.com/orgs/community/discussions/54404#discussioncomment-5804631
path: ${{ env.RENOVATE_CACHE_DIR }}
key: renovate-${{ github.run_id }}
================================================
FILE: .github/workflows/update_catalog.yaml
================================================
name: catalog_update
concurrency:
group: apps_catalog_update
on:
push:
branches:
- "master"
workflow_dispatch:
jobs:
publish_catalog:
if: "!contains(github.event.head_commit.message, '[skip ci]')"
runs-on: ubuntu-latest
container:
image: ghcr.io/truenas/apps_validation:latest
env:
FAKE_ENV: 1
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
token: ${{ secrets.PAT }}
- name: Add catalog json as a safe directory
run: |
/bin/bash -c "PWD=${pwd}; git config --global --add safe.directory $PWD"
- name: Publish catalog
run: |
/bin/bash -c "PWD=${pwd}; /usr/local/bin/apps_catalog_update publish --path $PWD"
- name: Check untracked files existence
run: echo "CHANGES=$(git -C $(pwd) --no-pager status --porcelain | wc -l)" >> "$GITHUB_ENV"
- uses: stefanzweifel/git-auto-commit-action@v7
if: env.CHANGES != '0'
with:
commit_message: "Publish new changes in catalog [skip ci]"
commit_user_name: sonicaj
commit_user_email: waqarsonic1@gmail.com
commit_author: sonicaj <waqarsonic1@gmail.com>
# Without this, the last_updated field will be updated for ALL apps, not just the ones that changed
skip_fetch: true
- name: Update catalog
if: env.CHANGES != '0'
run: |
/bin/bash -c "PWD=${pwd}; /usr/local/bin/apps_catalog_update update --path $PWD"
- uses: stefanzweifel/git-auto-commit-action@v7
if: env.CHANGES != '0'
with:
commit_message: "Update catalog changes [skip ci]"
commit_user_name: sonicaj
commit_user_email: waqarsonic1@gmail.com
commit_author: sonicaj <waqarsonic1@gmail.com>
================================================
FILE: .gitignore
================================================
ix-dev/**/rendered
out.yaml
.devbox
.vscode
.DS_Store
.venv
.pytest_cache
.coverage
__pycache__
================================================
FILE: CONTRIBUTIONS.md
================================================
# Contributing to TrueNAS Apps Catalog
This guide will walk you through everything you need to know about
contributing a new application to the catalog, from understanding the
project architecture to submitting your first pull request.
## Table of Contents
- [Welcome & Project Overview](#welcome--project-overview)
- [Getting Started](#getting-started)
- [Project Architecture](#project-architecture)
- [Contributing a New Application](#contributing-a-new-application)
- [Configuration System Deep Dive](#configuration-system-deep-dive)
- [Templates and Rendering](#templates-and-rendering)
- [Local Testing](#local-testing)
- [Updates and Migrations](#updates-and-migrations)
- [Best Practices](#best-practices)
- [Submission Guidelines](#submission-guidelines)
- [Getting Help](#getting-help)
---
## Welcome & Project Overview
### What is TrueNAS Apps?
TrueNAS Apps is a Docker Compose-based application catalog that makes it
easy to deploy and manage containerized applications on TrueNAS systems.
Think of it as an app store for your TrueNAS server.
Users can browse, install, configure, and manage applications through a
friendly web interface without needing to write Docker Compose files manually.
### How It Works
The system uses a templating approach:
1. **App developers** (that's you!) define applications using a combination of metadata files (`app.yaml`),
configuration schemas (`questions.yaml`), and Jinja2 templates (`docker-compose.yaml`)
2. **TrueNAS users** select an app from the catalog and fill out a form based on the questions you define
3. **The rendering system** processes your templates with the user's values and generates a standard Docker Compose file
4. **Docker Compose** deploys and manages the containers
### Our Mission
We aim to:
- Make self-hosting applications accessible to everyone, regardless of technical expertise
- Provide a curated, well-tested catalog of applications
- Enable easy application management with sensible defaults
- Support the open-source community by promoting and simplifying deployment of great applications
### Why Contribute?
By contributing an app to this catalog, you:
- Help TrueNAS users easily deploy applications they love
- Give back to the open-source community
- Gain experience with Docker, templating systems, and Python
- Connect with other app developers and the TrueNAS community
---
## Getting Started
### Prerequisites
Before you begin, make sure you have the following installed on your local machine:
#### Required Software
- **Git** - For cloning the repository
- **Docker** - To run containers locally
- **Docker Compose** - For orchestrating multi-container apps
- **Python 3.x** - The templating and testing system is written in Python
- **jq** - JSON processor used by the CI scripts
To avoid installing python (and its dependencies) on your system, you can install [**devbox**](https://www.jetify.com/devbox)
and use the provided `devbox.json` file to set up your environment:
```bash
devbox shell
```
#### Required Python Packages
> You can skip this if using devbox as described above.
Install these Python packages:
```bash
pip install pyyaml psutil pytest pytest-cov bcrypt pydantic
```
**Alternative using nix-shell** (if you have Nix installed):
```bash
nix-shell -p 'python3.withPackages (ps: with ps; [ pyyaml psutil pytest pytest-cov bcrypt pydantic ])'
```
### Cloning the Repository
```bash
git clone https://github.com/truenas/apps.git
cd apps
```
### Avoid Duplicate Work
Before starting work on an app:
1. **Check existing issues**: Someone might already be working on it
2. **Check existing PRs**: The app might already be in review
3. **Open an issue or comment**: Let others know you're working on it before starting work
4. **Open a draft PR**: This allows maintainers to catch any wrong directions early
### Repository Structure
Once cloned, you'll see this structure:
```txt
.
├── ix-dev/ # App definitions
│ ├── community/ # Community-contributed apps (this is where you work!)
│ ├── stable/ # TrueNAS curated apps
│ ├── enterprise/ # Apps for enterprise users
│ ├── dev/ # Development/testing
│ └── test/ # Test apps
├── library/ # Rendering library (Python modules)
│ └── 2.x.x/ # Library versions
├── trains/ # Auto-generated catalog files (DO NOT EDIT)
├── docs/ # Documentation
├── .github/ # CI/CD scripts and workflows
│ └── scripts/
│ └── ci.py # Local/CI testing script
└── README.md
```
**Important:** ⚠️ You should only modify files under `/ix-dev/` or `/library/` directories. All other files are auto-generated. ⚠️
### Understanding Trains
Apps are organized into "trains" (categories):
- **community**: Community-contributed apps - all new contributions go here
- **stable**: TrueNAS applications that are curated and maintained by TrueNAS team
- **enterprise**: Enterprise-grade applications maintained by iXsystems
All new contributions should target the `community` train. Other trains are managed by iXsystems maintainers.
---
## Project Architecture
### High-Level Overview
The TrueNAS Apps system follows this flow:
```txt
┌─────────────────┐
│ App Developer │ ← You define the app structure
└────────┬────────┘
│
▼
┌─────────────────────────────────────────────────┐
│ App Definition Files │
│ • app.yaml (metadata) │
│ • ix_values.yaml (static defaults) │
│ • questions.yaml (user configuration schema) │
│ • templates/docker-compose.yaml (Jinja2) │
└────────┬────────────────────────────────────────┘
│
▼
┌─────────────────┐
│ TrueNAS User │ ← User fills out configuration form
└────────┬────────┘
│
▼
┌─────────────────────────────────────────────────┐
│ Rendering System │
│ • Merges ix_values.yaml + user values │
│ • Processes Jinja2 template │
│ • Uses library functions (ports, storage, etc) │
│ • Validates configuration │
└────────┬────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────┐
│ Docker Compose File │
│ • Standard docker-compose.yaml │
│ • Contains all services, volumes, networks │
└────────┬────────────────────────────────────────┘
│
▼
┌─────────────────┐
│ Docker Engine │ ← Deploys and manages containers
└─────────────────┘
```
### Component Architecture (Top-Down)
#### 1. App Directory Structure
Each app lives in `/ix-dev/{train}/{app}/` and has this structure:
```txt
/ix-dev/{train}/{app}/
├── app.yaml # App metadata (required)
├── item.yaml # Auto-generated catalog entry
├── ix_values.yaml # Static default values (required)
├── questions.yaml # User configuration schema (required)
├── README.md # Short app description (required)
├── app_migrations.yaml # Migration definitions (optional)
├── migrations/ # Migration scripts (optional)
│ └── migration_script # Python migration script
└── templates/
├── docker-compose.yaml # Jinja2 template (required)
├── library/ # Auto-copied library files (auto-generated)
│ └── base_v2_x_xx/ # Library version (auto-generated)
├── rendered/ # Temporary (gitignored)
│ └── docker-compose.yaml # Rendered compose file (auto-generated)
└── test_values/ # CI test configurations (required)
└── basic-values.yaml # Basic test scenario (required)
```
#### 2. The Library System
The library (`/library/{version}/`) is a collection of Python modules that handle common tasks:
- **render.py**: Main orchestration—coordinates the entire rendering process
- **container.py**: Container configuration (image, command, environment, etc.)
- **storage.py**: Volume and mount management
- **ports.py**: Port mapping configuration
- **environment.py**: Environment variable handling
- **healthcheck.py**: Health check configuration
- **deps_*.py**: Pre-built common dependencies:
- `deps_postgres.py`: PostgreSQL database
- `deps_redis.py`: Redis cache
- `deps_mariadb.py`: MariaDB database
- `deps_perms.py`: Permission initialization container
- And more...
The library provides a Python API that you use in your Jinja2 templates to generate Docker Compose configuration.
#### 3. The Rendering Process
When a user deploys an app:
1. **Value Collection**: User input from the UI form (based on `questions.yaml`) is collected
2. **Validation**: Middleware validates user input against the schema
3. **Value Merging**: User values are merged with `ix_values.yaml` defaults
4. **Template Processing**:
- Jinja2 processes `templates/docker-compose.yaml`
- Your template calls library functions to build configuration
- Library returns structured data representing Docker Compose services
5. **Rendering**: The final Docker Compose YAML is generated
6. **Validation**: The compose file is validated against docker engine for spec correctness
7. **Deployment**: Docker Compose creates and starts the containers
8. **Monitoring**: Health checks ensure containers are running properly
9. **Portal Generation**: Web UI links are made available to the user
#### 4. The CI/CD Pipeline
The GitHub Actions CI/CD system:
- Validates all app definitions
- Runs tests against test values
- Publishes to the catalog (after PR is merged)
---
## Contributing a New Application
### Step-by-Step Process
#### Step 1: Find a Similar App
The easiest way to create a new app is to copy an existing one that's similar. Browse `/ix-dev/community/` to find an app with similar requirements:
- Similar number of containers (single app vs. app + database)
- Similar storage needs
- Similar networking requirements
```bash
# Example: Creating a new app based on qbittorrent
cd ix-dev/community
cp -r qbittorrent myapp
cd myapp
```
#### Step 2: Modify app.yaml
Update the app metadata in `app.yaml`:
```yaml
app_version: 2.1.0 # Upstream application version (ie the container image tag)
capabilities: [] # List any Linux capabilities needed (autogenerated using the generate metadata script)
categories: # Single category that best fits the app
- productivity
date_added: '2025-01-01' # Date the app was added to TrueNAS
description: A brief description of what the app does
home: https://myapp.com # Upstream homepage
host_mounts: [] # List any host mounts needed (usually for devices like /var/run/docker.sock)
icon: https://media.sys.truenas.net/apps/myapp/icons/icon.png
keywords:
- productivity
- tools
lib_version: 2.1.60 # Use the latest library version (check /library/)
lib_version_hash: "" # Leave empty, will be auto-generated
maintainers: # TrueNAS is the only maintainer for now
- email: dev@ixsystems.com
name: truenas
url: https://www.ixsystems.com
name: myapp # Must match directory name
run_as_context: # Metadata for user/group the app runs as (use 568 if it can run as any non-root user)
- description: MyApp runs as any non-root user
gid: 568
group_name: myapp
uid: 568
user_name: myapp
screenshots: [] # URLs to screenshots (hosted on TrueNAS CDN)
sources: [] # Upstream source code repositories
title: My Awesome Application # Human-friendly app title
train: community # Must match parent directory
version: 1.0.0 # App version (start at 1.0.0)
```
**Key fields:**
- `name`: Must exactly match your directory name
- `train`: Must match the parent directory (`community`, `stable`, etc.)
- `version`: Increment this whenever you make changes to the app
- `app_version`: The version of the upstream application
- `lib_version`: Use the latest non-v1 library version (check `/library/` directory)
- `run_as_context`: Metadata for user/group the app runs as (security best practice)
**About icons and screenshots:**
For icons and screenshots that will be hosted on the TrueNAS CDN,
include the URLs or attach the images in your PR description.
The PR reviewer will upload them to the CDN and provide you with the correct URLs.
#### Step 3: Define Static Values (ix_values.yaml)
This file contains values that are always used, not exposed to users:
Keys for the images must always end with `image`.
If the versioning of an image is not SemVer, a custom versioning regex must
be added in the renovate-config.js file to ensure proper updates.
Prefer `ghcr` over `docker.io` for images.
```yaml
images:
image:
repository: myorg/myapp
tag: 2.1.0
worker_image:
repository: myorg/myapp-worker
tag: 2.1.0
consts:
app_container_name: myapp
perms_container_name: myapp-perms
```
**Common patterns:**
- `images`: Define all container images and their tags
- `consts`: Constants used throughout your templates
#### Step 4: Create User Configuration Schema (questions.yaml)
This defines the form users see when configuring your app.
Most groups should exist across all apps. For example:
- My App Configuration (App-specific settings)
- User and Group Configuration (Can be skipped if the app can ONLY run as a specific uid/gid and users can't choose)
- Network Configuration
- Storage Configuration
- Labels Configuration
- Resources Configuration
Also keep in mind that most groups and their fields structure is "fixed" and cannot be changed.
Rendering library does lots of automated things based on this structure.
It uses a schema-based approach:
> This is a simplified example - with only few of the above mentioned groups.
```yaml
groups:
- name: My App Configuration
description: Configure MyApp Settings
- name: Network
description: Network Configuration
- name: Storage
description: Storage Configuration
questions:
- variable: myapp
label: ""
group: My App Configuration
schema:
type: dict
attrs:
- variable: admin_email
label: Administrator Email
description: Email address for the administrator
schema:
type: string
required: true
default: "admin@example.com"
- variable: enable_feature
label: Enable Advanced Feature
schema:
type: boolean
default: false
- variable: additional_envs
label: Additional 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
# Network Configuration
- variable: network
label: ""
group: Network
schema:
type: dict
attrs:
# Also simplified, a port must have whole lot more attributes.
# See other apps for full example.
- variable: web_port
label: Web Port
description: Port for the web interface
schema:
type: dict
attrs:
- variable: port
label: Port Number
schema:
type: int
default: 8080
min: 1024
max: 65535
required: true
# Storage Configuration
- variable: storage
label: ""
group: Storage
schema:
type: dict
attrs:
# Also simplified, a storage must have whole lot more attributes.
# See other apps for full example.
- variable: config
label: App Configuration Storage
description: Stores application configuration
schema:
type: dict
attrs:
- variable: type
label: Type
schema:
type: string
default: "ix_volume"
enum:
- value: "host_path"
description: "Host Path"
- value: "ix_volume"
description: "TrueNAS Dataset"
- variable: ix_volume_config
label: Dataset Configuration
schema:
type: dict
show_if: [["type", "=", "ix_volume"]]
attrs:
- variable: acl_enable
label: Enable ACL
schema:
type: boolean
default: false
- variable: host_path_config
label: Host Path Configuration
schema:
type: dict
show_if: [["type", "=", "host_path"]]
attrs:
- variable: path
label: Host Path
schema:
type: hostpath
required: true
```
**Schema types available:**
- `string`: Text input
- `int`: Number input
- `boolean`: Checkbox
- `dict`: Nested configuration (object)
- `list`: Array of items
- `uri`: URL input
- `path`: File/directory path on the system
- `hostpath`: Path that must exist on the host
> And more...
**Important attributes:**
- `required`: Whether the field is mandatory
- `default`: Default value
- `min`/`max`: For numeric fields
- `min_length`/`max_length`: For string fields
- `enum`: List of allowed values
- `show_if`: Conditional display based on other field values
- `private`: Hides the value (for passwords)
- `hidden`: Completely hides the field but includes it in config
> And more...
#### Step 5: Create the Docker Compose Template
The `templates/docker-compose.yaml` file is a Jinja2 template that uses the library to generate configuration:
```yaml
{# First, initialize the rendering system #}
{% set tpl = ix_lib.base.render.Render(values) %}
{# Define the main application container #}
{% set app = tpl.add_container(values.consts.app_container_name, "image") %}
{% do app.set_user(values.run_as.user, values.run_as.group) %}
{% do app.healthcheck.set_test("curl", {"port": 8080, "path": "/health"}) %}
{# Configure environment variables #}
{% do app.environment.add_env("APP_PORT", values.network.web_port.port) %}
{% do app.environment.add_env("ADMIN_EMAIL", values.myapp.admin_email) %}
{# Add port mappings #}
{% do app.add_port(values.network.web_port) %}
{# Configure storage #}
{% do app.add_storage("/config", values.storage.config) %}
{# Setup permissions container for storage initialization #}
{% set perms = tpl.deps.perms(values.consts.perms_container_name) %}
{% do perms.add_or_skip_action("config", values.storage.config, {"uid": 568, "gid": 568, "mode": "check"}) %}
{% if perms.has_actions() %}
{% do perms.activate() %}
{% do app.depends.add_dependency(values.consts.perms_container_name, "service_completed_successfully") %}
{% endif %}
{# Add portal for UI access #}
{% do tpl.portals.add(values.network.web_port, scheme="http", path="/") %}
{# Render the final configuration #}
{{ tpl.render() | tojson }}
```
Explore other apps for more examples.
**Key library components:**
- `tpl.add_container(name, image_key)`: Creates a new container
- `app.set_user(uid, gid)`: Sets the user the container runs as
- `app.healthcheck.set_test()`: Configures health checks
- `app.environment.add_env()`: Adds environment variables
- `app.add_port()`: Maps ports to the host
- `app.add_storage()`: Mounts volumes
- `tpl.deps.perms()`: Creates a permissions init container
- `tpl.portals.add()`: Adds a web UI portal link
**Adding dependencies (database example):**
```yaml
{# Add PostgreSQL database #}
{% set pg_config = {
"user": values.consts.db_user,
"password": values.myapp.db_password,
"database": values.consts.db_name,
"volume": values.storage.postgres_data,
} %}
{% set postgres = tpl.deps.postgres("postgres", "postgres_image", pg_config, perms) %}
{% do app.depends.add_dependency("postgres", "service_healthy") %}
{# Use postgres.get_url() to generate the connection string #}
{% do app.environment.add_env("DATABASE_URL", postgres.get_url("postgresql")) %}
```
#### Step 6: Create Test Files
Create test value files in `templates/test_values/` to test different configurations:
**basic-values.yaml:**
```yaml
resources:
limits:
cpus: 2.0
memory: 4096
# Should contain all options that are exposed in the questions.yaml
myapp:
admin_email: test@example.com
enable_feature: false
additional_envs: []
network:
web_port:
bind_mode: published
port_number: 30080 # Use a non-default port for testing, catches issues early
ix_volumes:
test_myapp_config: /opt/tests/mnt/myapp/config
storage:
config:
type: ix_volume
ix_volume_config:
dataset_name: test_myapp_config
create_host_path: true
```
**Note on test storage paths:**
Most apps use directories like `/opt/tests/**` for storage in test files. This is because:
- macOS whitelists `/opt/` by default for Docker
- Linux doesn't have this restriction
- It prevents accidentally mounting sensitive directories
Make sure your test files won't mount any directories you don't want them to!
#### Step 7: Create README.md
Keep the README brief - just a title and short description. Link to upstream documentation for details:
```markdown
# My Awesome Application
[My Awesome Application](https://myapp.com) is a tool for doing awesome things.
```
---
## Configuration System Deep Dive
### Understanding Values Hierarchy
When your template is rendered, values come from multiple sources merged in this order:
1. `ix_values.yaml` - Your static defaults
2. User input from `questions.yaml` (or test values during testing)
Access values in templates using: `values.path.to.variable`
---
## Templates and Rendering
### Template Structure
Every template follows this basic structure:
```yaml
{# 1. Initialize the rendering system #}
{% set tpl = ix_lib.base.render.Render(values) %}
{# 2. Add containers #}
{# 3. Configure containers #}
{# 4. Add dependencies #}
{# 5. Setup permissions #}
{# 6. Add portals #}
{# Final: Render the configuration #}
{{ tpl.render() | tojson }}
```
### Library API Reference
#### Adding a Container
```python
{% set app = tpl.add_container("container_name", "image_key") %}
```
- First argument: Container name (use value from `consts`)
- Second argument: Key in `ix_values.yaml` images section
#### Container Configuration
```python
{# Set user and group - usually picked automatically from run_as_context in app.yaml #}
{# Only set manually if you need to override the default #}
{% do app.set_user(568, 568) %}
{# Set entrypoint and command #}
{% do app.set_entrypoint(["myapp"]) %}
{% do app.set_command(["--config", "/config/app.conf"]) %}
{# Add environment variables #}
{% do app.environment.add_env("KEY", "value") %}
{% do app.environment.add_env("PORT", 8080) %}
{# Add port mappings #}
{% do app.add_port(values.network.web_port) %}
{# Add storage mounts #}
{% do app.add_storage("/config", values.storage.config) %}
{% do app.add_storage("/data", values.storage.data) %}
{# Set capabilities #}
{% do app.add_caps(["NET_ADMIN", "SYS_ADMIN"]) %}
```
#### Health Checks
```python
{# HTTP health check #}
{% do app.healthcheck.set_test("curl", {"port": 8080, "path": "/"}) %}
{# TCP health check #}
{% do app.healthcheck.set_test("netcat", {"port": 5432}) %}
{# Disable health check #}
{% do app.healthcheck.disable() %}
```
#### Dependencies
```python
{# Wait for service to be healthy #}
{% do app.depends.add_dependency("database", "service_healthy") %}
{# Wait for init container to complete #}
{% do app.depends.add_dependency("init", "service_completed_successfully") %}
```
#### Permissions Container
```python
{# Create permissions container #}
{% set perms = tpl.deps.perms("perms_container_name") %}
{% set perms_config = {"uid": 568, "gid": 568, "mode": "check"} %}
{# Add permission actions #}
{% do perms.add_or_skip_action("config", values.storage.config, perms_config) %}
{# Activate and add dependency #}
{% if perms.has_actions() %}
{% do perms.activate() %}
{% do app.depends.add_dependency("perms_container_name", "service_completed_successfully") %}
{% endif %}
```
**Permission modes:**
> Both modes will skip if the directory is not empty.
- `check`: Only fix if permissions are wrong
- `always`: Always set permissions
#### Common Dependencies
**PostgreSQL:**
```python
{% set pg_config = {
"user": "myapp",
"password": values.myapp.db_password,
"database": "myapp_db",
"volume": values.storage.postgres_data,
} %}
{% set postgres = tpl.deps.postgres("postgres", "postgres_image", pg_config, perms) %}
{% do app.depends.add_dependency("postgres", "service_healthy") %}
```
**Redis:**
```python
{% set redis_config = {
"password": values.myapp.redis_password,
"volume": values.storage.redis_data,
} %}
{% set redis = tpl.deps.redis("redis", "redis_image", redis_config, perms) %}
{% do app.depends.add_dependency("redis", "service_healthy") %}
```
**MariaDB:**
```python
{% set mariadb_config = {
"user": "myapp",
"password": values.myapp.db_password,
"database": "myapp_db",
"root_password": values.myapp.root_password,
"volume": values.storage.mariadb_data,
} %}
{% set mariadb = tpl.deps.mariadb("mariadb", "mariadb_image", mariadb_config, perms) %}
{% do app.depends.add_dependency("mariadb", "service_healthy") %}
```
#### Portals
Portals create clickable links in the TrueNAS UI:
```python
{# Simple portal (HTTP, path="/") #}
{% do tpl.portals.add(values.network.web_port) %}
{# Custom portal #}
{% do tpl.portals.add(values.network.web_port, {"scheme": "https", "path": "/admin"}) %}
{# Multiple portals #}
{% do tpl.portals.add(values.network.web_port, {"scheme": "http"}) %}
{% do tpl.portals.add(values.network.api_port, {"name": "Custom Label", "path": "/api"}) %}
```
#### Notes
Add informational notes displayed to users:
```python
{% do tpl.notes.add_info("First time setup requires visiting /setup") %}
{% do tpl.notes.add_warning("This app requires GPU passthrough") %}
```
### What Gets Generated
Your template generates a standard Docker Compose file. Here's an example:
**Input (your template):**
```yaml
{% set tpl = ix_lib.base.render.Render(values) %}
{% set app = tpl.add_container(values.consts.app_container_name, "image") %}
{% do app.set_user(568, 568) %}
{% do app.add_port(values.network.web_port) %}
{% do app.healthcheck.set_test("curl", {"port": 8080, "path": "/ping"}) %}
{% do app.add_storage("/config", values.storage.config) %}
{{ tpl.render() | tojson }}
```
**Output (generated compose file):**
```yaml
services:
myapp:
cap_drop:
- ALL
deploy:
resources:
limits:
cpus: 2
memory: "4294967296"
environment:
GID: "568"
GROUP_ID: "568"
NVIDIA_VISIBLE_DEVICES: void
PGID: "568"
PUID: "568"
TZ: Etc/UTC
UID: "568"
UMASK: "002"
UMASK_SET: "002"
USER_ID: "568"
group_add:
- "568"
healthcheck:
test:
- CMD
- curl
- --request
- GET
- --silent
- --output
- /dev/null
- --show-error
- --fail
- http://127.0.0.1:8080/ping
timeout: 5s
interval: 30s
retries: 5
start_period: 15s
start_interval: 2s
image: some-repo/myapp:2.1.0
platform: linux/amd64
ports:
- mode: ingress
target: 8080
published: "8080"
protocol: tcp
restart: unless-stopped
security_opt:
- no-new-privileges=true
user: 568:568
volumes:
- type: bind
source: /opt/tests/mnt/config
target: /config
bind:
propagation: rprivate
create_host_path: true
x-notes: |
# <app_name>
## Security
**Read the following security precautions to ensure that you wish to continue using this application.**
---
### Container: [myapp]
#### Running user/group(s)
- User: 568
- Group: 568
- Supplementary Groups: apps
## Bug Reports and Feature Requests
If you find a bug in this app or have an idea for a new feature, please file an issue at
https://github.com/truenas/apps
x-portals:
- host: 0.0.0.0
name: Web UI
path: /
port: 8080
scheme: http
```
---
## Local Testing
Before submitting your PR, thoroughly test your app locally using the CI script.
### Running Tests
The `.github/scripts/ci.py` script is your primary testing tool:
```bash
# Basic test - deploys the app and waits for it to be healthy
./.github/scripts/ci.py --app myapp --train community --test-file basic-values.yaml
# Keep the app running for manual testing
./.github/scripts/ci.py --app myapp --train community --test-file basic-values.yaml --wait=true
# or devbox run app-test community myapp <optionally basic-values.yaml>
# Just render the compose file without deploying
./.github/scripts/ci.py --app myapp --train community --test-file basic-values.yaml --render-only=true
# or devbox run app-render community myapp <optionally basic-values.yaml>
```
### Command Options
- `--app`: Your app directory name
- `--train`: The train (community, stable, etc.)
- `--test-file`: Which test file from `templates/test_values/` to use
- `--wait=true`: Keeps the app running until you stop it (Ctrl+C). Shows the web UI URL if available
- `--render-only=true`: Only renders the compose file without deploying
### What the CI Script Does
When you run the CI script, it automatically:
1. **Generates `item.yaml`**: Creates the catalog entry
2. **Updates library files**: Copies the correct library version to `templates/library/` based on `lib_version` in `app.yaml`
3. **Updates `lib_version_hash`**: Calculates and sets the hash in `app.yaml`
4. **Renders the template**: Processes your Jinja2 template with the test values
5. **Deploys with Docker Compose**: Starts the containers (unless `--render-only`)
6. **Monitors health**: Waits for containers to become healthy (times out after 10 minutes)
### Metadata Generation / Validation
```bash
# Generates some metadata (like capabilities) for your app
./.github/scripts/generate_metadata.py --app myapp --train community
# Validates ports in questions.yaml are unique
./.github/scripts/port_validation.py
```
### Testing Workflow
1. **Start with basic test:**
```bash
./.github/scripts/ci.py --app myapp --train community --test-file basic-values.yaml --wait=true
```
2. **Check the output:**
- The script will show you the rendered compose file location
- It will display the web UI URL if configured
- Watch for any errors in container startup
3. **Verify functionality:**
- Open the web UI in your browser
- Test basic functionality
- Check logs: `docker logs myapp`
4. **Test different configurations:**
- Create additional test files if needed (e.g., `with-database-values.yaml`, `hostpath-values.yaml`)
- Test each configuration thoroughly
5. **Clean up:**
- Press Ctrl+C to stop (with `--wait=true`)
- Or the script will auto-cleanup if it runs without `--wait`
- Manual cleanup if needed: `docker compose -f /path/to/rendered/docker-compose.yaml down -v`
### Troubleshooting
**Containers won't start:**
- Check `docker logs <container_name>` for errors
- Verify image names and tags in `ix_values.yaml`
- Check port conflicts: `docker ps` to see if ports are already in use
**Permission errors:**
- Verify `set_user` in your template
- Check permissions container configuration
- Ensure storage paths are accessible
**Template errors:**
- Use `--render-only=true` to see the rendered compose file
- Check for Jinja2 syntax errors
- Verify all values paths exist in your test files
**Health checks failing:**
- Verify the health check command is correct
- Verify the application ships the binary used in the health check (ie `curl`, etc.)
### Testing on TrueNAS
Currently, there's no easy way to test directly on a TrueNAS system before your PR is merged. However:
- If it works on your local machine with Docker Compose, it should work on TrueNAS
- Exceptions include hardware-specific features (GPU, devices, etc.)
- Let the reviewer know about any special requirements in your PR
### Testing questions.yaml
The `questions.yaml` schema is validated during CI, but also needs manual review:
- To see how different values affect the rendered compose file, modify your test files
- Test all conditional fields (`show_if`)
- Verify all enum options work correctly
- Test required vs optional fields
---
## Updates and Migrations
When you update an existing app or change its configuration structure, you may need migrations to preserve user data and settings.
### When to Use Migrations
Use migrations when:
- Changing the structure of configuration values
- Renaming configuration fields
### Creating a Migration
#### Step 1: Create app_migrations.yaml
Define when your migration should run:
```yaml
migrations:
- file: migrate_to_v2
from:
max_version: 1.0.10 # Applies to apps upgrading from version <= 1.0.10
target:
min_version: 2.0.0 # When upgrading to version >= 2.0.0
```
#### Step 2: Write the Migration Script
Create `migrations/migrate_to_v2` (Python script):
```python
#!/usr/bin/python3
import yaml
import sys
import os
def migrate(values):
"""
Transform old configuration to new configuration.
Old structure:
network:
web_port: 8080
New structure:
network:
web_port:
port: 8080
bind_mode: "published"
"""
# Check if old structure exists
if isinstance(values.get("network", {}).get("web_port"), int):
old_port = values["network"]["web_port"]
# Transform to new structure
values["network"]["web_port"] = {
"port": old_port,
"bind_mode": "published",
"host_ips": [],
}
return values
if __name__ == "__main__":
if len(sys.argv) != 2:
exit(1)
if os.path.exists(sys.argv[1]):
with open(sys.argv[1], "r") as f:
print(yaml.dump(migrate(yaml.safe_load(f.read()))))
```
#### Step 3: Make Script Executable
```bash
chmod +x migrations/migrate_to_v2
```
#### Step 4: Update app.yaml
Increment the `version` field to trigger the migration:
```yaml
version: 2.0.0 # Incremented from 1.0.10
```
### Migration Best Practices
1. **Handle Edge Cases**: Check for missing or unexpected values
2. **Test Thoroughly**: Test migrations with various old configurations
3. **Document Changes**: Explain what changed in your PR description
4. **Preserve Data**: Never delete user data without explicit consent
5. **Validate Output**: Ensure migrated values match the new schema
---
## Best Practices
### Security
1. **Run as Non-Root**: Always define `run_as_context` with a non-root user
> Note: this is only METADATA
```yaml
run_as_context:
- uid: 568
gid: 568
user_name: myapp
group_name: myapp
```
2. **Use Secrets**: Mark sensitive fields as private in `questions.yaml`
> Note: this is just UI masking.
```yaml
- variable: password
schema:
type: string
private: true
```
3. **Minimal Capabilities**: Only add capabilities if absolutely necessary
```python
{% do app.set_capabilities(["NET_ADMIN"]) %} # Only if needed
```
4. **Validate Input**: Use schema validation (min, max, enum) in `questions.yaml`
### Performance
1. **Use Health Checks**: Always define appropriate health checks
```python
{% do app.healthcheck.set_test("curl", {"port": 8080, "path": "/health"}) %}
```
2. **Optimize Dependencies**: Only add dependencies when needed
```python
{% do app.depends.add_dependency("postgres", "service_healthy") %}
```
3. **Use Latest Library**: Always use the newest non-v1 library version
### User Experience
1. **Sensible Defaults**: Provide good default values in `questions.yaml`
2. **Clear Descriptions**: Add helpful descriptions to fields (where applicable)
3. **Group Related Settings**: Use the existing groups to organize configuration
4. **Conditional Fields**: Use `show_if` to hide irrelevant options
5. **Add Portals**: Always add web UI portals when applicable
### Code Quality
1. **Start from Similar App**: Copy a similar app rather than starting from scratch
2. **Follow Naming Conventions**: Use consistent naming (snake_case for variables)
3. **Comment Complex Logic**: Add comments in templates for clarity
4. **Test Multiple Scenarios**: Create multiple test files
5. **Clean Up**: Remove unused code from copied apps
### Storage
1. **Use ix_volume by Default**: TrueNAS-managed datasets are preferred
as defaults, as it makes it easy to spin up the app and test.
```yaml
default: "ix_volume"
```
2. **Document Storage Needs**: Explain what each storage mount is for
3. **Test Paths**: Use `/opt/tests/` prefix in test files for compatibility
### Versioning
1. **Semantic Versioning**: Use semantic versioning for `version` field
- Major: Breaking changes
- Minor: New features
- Patch: Bug fixes
2. **Track Upstream**: Keep `app_version` in sync with main container tag
3. **Increment on Every Change**: Always bump `version` when modifying the app
### Documentation
1. **Document Special Requirements**: Note GPU, devices, or network requirements
2. **Add Configuration Notes**: Include setup instructions if needed
3. **Link to Upstream Docs**: Provide links to official documentation
---
## Submission Guidelines
### Before You Submit
Checklist before opening a PR:
- [ ] App works locally with all test files
- [ ] `app.yaml` metadata is complete and accurate
- [ ] `questions.yaml` has clear labels and descriptions
- [ ] All test files pass successfully
- [ ] README.md is written
- [ ] Only files under `/ix-dev/` or `/library/` are modified
- [ ] No auto-generated files are included in the PR
- [ ] Icons/screenshots are ready (links provided in PR description)
### PR Description Template
When you create a new pull request, GitHub will automatically populate it with our PR template. This template includes sections for:
- **Description**: Brief overview of the app and what it does
- **App Information**: Links to upstream repository, documentation, license, and version
- **Testing**: Checklist of test scenarios you've verified
- **Icons and Screenshots**: Visual assets for the app
- **Special Notes**: Any important setup or usage information
- **Checklist**: Final verification before submission
The template is located at [`.github/PULL_REQUEST_TEMPLATE/app_addition.md`](.github/PULL_REQUEST_TEMPLATE/app_addition.md)
and will be automatically loaded when you create a PR.
Simply fill in the placeholders with your app's specific information.
### Review Process
What to expect:
1. **Automated Checks**: CI will run automatically
- Validates your app structure
- Runs test files
- Checks for errors
2. **Human Review**: A maintainer will review your PR
- Check code quality
- Verify app works as expected
- Suggest improvements
3. **Iteration**: You may need to make changes
- Address review comments
- Fix any issues found
- Update based on feedback
4. **CDN Upload**: Reviewer will upload icons/screenshots
- You'll receive CDN URLs
- Update your PR with the URLs
5. **Merge**: Once approved, your PR will be merged!
### After Your PR is Merged
Congratulations! Your app is now in the catalog. 🎉
#### Notify Upstream Developers
It's a great idea to let the upstream app developers know that their app is now available on TrueNAS:
- **Contact them politely**: Via GitHub issue, email, or Discord
- **Provide a quick how-to**: Explain how to deploy their app on TrueNAS
- **Suggest adding TrueNAS**: To their supported platforms list
- **Share the catalog link**: Link to the TrueNAS Apps catalog
---
## Getting Help
### Resources
- **GitHub Discussions**: https://github.com/truenas/apps/discussions
- Ask questions
- Share tips and tricks
- Collaborate with other developers
- **Library Tests**: `/library/{version}/tests/`
- Real examples of library usage
- See how different features work
- **Existing Apps**: `/ix-dev/community/`
- Browse real-world examples
- See how similar apps are structured
- Copy patterns that work
- **TrueNAS Forums**: https://forums.truenas.com
- Community support
- User feedback
- General TrueNAS questions
### Common Questions
**Q: Which library version should I use?**
A: Always use the latest non-v1 version from `/library/`. Check the directory for available versions and use the highest numbered 2.x.x version.
**Q: My app needs a GPU. How do I configure that?**
A: Check apps like `plex` or `jellyfin` that use GPU passthrough. You'll need to add device mappings and possibly capabilities.
**Q: Can I test on TrueNAS before submitting?**
A: Currently there's no easy way. Test locally with Docker Compose—if it works there, it should work on TrueNAS.
**Q: How do I handle questions.yaml migrations?**
A: Create an `app_migrations.yaml` file and a Python migration script. See the "Updates and Migrations" section above.
**Q: Can I add an app to the stable or enterprise train?**
A: You can't. This train is managed by TrueNAS maintainers only. Submit to the community train only.
**Q: How do I update an existing app?**
A: Fork the repo, make your changes, increment the version in `app.yaml`, and open a PR. Include what changed in the description.
**Q: An app is outdated. Can I update it?**
A: If it's been more than 2 days that the upstream container tag has been released, and our bot hasn't picked it up yet, please open an issue.
A fix has to be applied so the bot can pick it up.
### Getting Involved
Want to do more than just contribute apps?
- **Review PRs**: Help review other contributors' apps
- **Improve Documentation**: Submit improvements to this guide
- **Report Issues**: Found a bug? Open an issue
- **Help Users**: Answer questions in Discussions / Issues
### Contact
- **GitHub Issues**: For bugs and feature requests
- **GitHub Discussions**: For questions and general discussion
- **Pull Requests**: For contributions
---
## Thank You!
Thank you for contributing to the TrueNAS Apps catalog! Your work helps make self-hosting accessible to everyone. We appreciate your time and effort in making this ecosystem better.
Happy coding! 🚀
================================================
FILE: LICENSE
================================================
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license
document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.
================================================
FILE: README.md
================================================
# TrueNAS Apps Catalog
This repository contains the Docker-Compose based App catalog used by TrueNAS systems to render and update the Apps catalog.

## Deprecating Apps, Features, Configuration or Functionality
When an `App`, `Feature`, `Configuration` or `Functionality` is deprecated, it will be marked as such.
On an already installed app, you will see a deprecation notice in the `Notes` card in the TrueNAS UI.
In the scenario that a whole app is deprecated (not just a configuration option).
The deprecation notice will also be visible in the `Discover` tab of the TrueNAS UI, next to the app's title.
**The deprecation period is 3 months.**
After the deprecation period, the app, feature, configuration or functionality will be removed.
## Contributing Applications
The Apps catalog is open for contributions! We provide instructions on how to locally develop and test new applications in our [contributors guide](CONTRIBUTIONS.md).
Questions on the development of applications? Please head over to our [discussions](https://github.com/truenas/apps/discussions) page to ask questions and collaborate with other App Developers.
## Parity Status with Legacy K3's truenas/charts (100% 🚀)
<details>
<summary>Show Apps List</summary>
| App | Train | Added | Migrated |
| -------------------- | ---------- | ----- | -------------------------------------------------------------------- |
| collabora | charts | ✅ | ✅ |
| diskoverdata | charts | ✅ | ✅ |
| elastic-search | charts | ✅ | ✅ |
| emby | charts | ✅ | ✅ |
| home-assistant | charts | ✅ | ✅ - [Manual steps needed](https://github.com/truenas/apps/pull/492) |
| ix-chart | charts | ✅ | ✅ |
| minio | charts | ✅ | ✅ |
| netdata | charts | ✅ | ✅ |
| nextcloud | charts | ✅ | ✅ |
| photoprism | charts | ✅ | ✅ |
| plex | charts | ✅ | ✅ |
| pihole | charts | ✅ | ✅ |
| prometheus | charts | ✅ | ✅ |
| storj | charts | ✅ | ✅ |
| syncthing | charts | ✅ | ✅ |
| wg-easy | charts | ✅ | ✅ |
| actual-budget | community | ✅ | ✅ |
| adguard-home | community | ✅ | ✅ |
| audiobookshelf | community | ✅ | ✅ |
| autobrr | community | ✅ | ✅ |
| bazarr | community | ✅ | ✅ |
| briefkasten | community | ✅ | ✅ |
| castopod | community | ✅ | ✅ |
| chia | community | ✅ | ✅ |
| clamav | community | ✅ | ✅ |
| cloudflared | community | ✅ | ✅ |
| dashy | community | ✅ | ✅ |
| deluge | community | ✅ | ✅ |
| ddns-updater | community | ✅ | ✅ |
| distribution | community | ✅ | ✅ |
| drawio | community | ✅ | ✅ |
| filebrowser | community | ✅ | ✅ |
| firefly-iii | community | ✅ | ✅ |
| flame | community | ✅ | ✅ |
| freshrss | community | ✅ | ✅ |
| frigate | community | ✅ | ✅ |
| fscrawler | community | ✅ | ✅ |
| gitea | community | ✅ | ✅ |
| handbrake | community | ✅ | ✅ |
| grafana | community | ✅ | ✅ |
| homarr | community | ✅ | ✅ |
| homer | community | ✅ | ✅ |
| homepage | community | ✅ | ✅ |
| immich | community | ✅ | ✅ |
| invidious | community | ✅ | ✅ |
| ipfs | community | ✅ | ✅ |
| jellyfin | community | ✅ | ✅ |
| jellyseerr | community | ✅ | ✅ |
| jenkins | community | ✅ | ✅ |
| joplin | community | ✅ | ✅ |
| kapowarr | community | ✅ | ✅ |
| kavita | community | ✅ | ✅ |
| komga | community | ✅ | ✅ |
| lidarr | community | ✅ | ✅ |
| linkding | community | ✅ | ✅ |
| listmonk | community | ✅ | ✅ |
| logseq | community | ✅ | ✅ |
| mealie | community | ✅ | ✅ |
| metube | community | ✅ | ✅ |
| minecraft | community | ✅ | ✅ |
| mineos | community | ✅ | ✅ |
| mumble | community | ✅ | ✅ |
| n8n | community | ✅ | ✅ |
| navidrome | community | ✅ | ✅ |
| nginx-proxy-manager | community | ✅ | ✅ |
| netbootxyz | community | ✅ | ✅ |
| node-red | community | ✅ | ✅ |
| odoo | community | ✅ | ✅ |
| omada-controller | community | ✅ | ✅ |
| organizr | community | ✅ | ✅ |
| overseerr | community | ✅ | ✅ |
| palworld | community | ✅ | ✅ |
| paperless-ngx | community | ✅ | ✅ |
| passbolt | community | ✅ | ✅ |
| pgadmin | community | ✅ | ✅ |
| pigallery2 | community | ✅ | ✅ |
| piwigo | community | ✅ | ✅ |
| planka | community | ✅ | ✅ |
| plex-auto-languages | community | ✅ | ✅ |
| prowlarr | community | ✅ | ✅ |
| radarr | community | ✅ | ✅ |
| qbittorrent | community | ✅ | ✅ |
| readarr | community | ✅ | ✅ |
| recyclarr | community | ✅ | ✅ |
| redis | community | ✅ | ✅ |
| roundcube | community | ✅ | ✅ |
| rsyncd | community | ✅ | ✅ |
| rust-desk | community | ✅ | ✅ |
| sabnzbd | community | ✅ | ✅ |
| searxng | community | ✅ | ✅ |
| sftpgo | community | ✅ | ✅ |
| sonarr | community | ✅ | ✅ |
| tailscale | community | ✅ | ✅ - [Manual steps needed](https://github.com/truenas/apps/pull/641) |
| tautulli | community | ✅ | ✅ |
| tdarr | community | ✅ | ✅ |
| terraria | community | ✅ | ✅ |
| tftpd-hpa | community | ✅ | ✅ |
| tiny-media-manager | community | ✅ | ✅ |
| transmission | community | ✅ | ✅ |
| twofactor-auth | community | ✅ | ✅ |
| unifi-controller | community | ✅ | ✅ |
| unifi-protect-backup | community | ✅ | ✅ |
| vaultwarden | community | ✅ | ✅ |
| vikunja | community | ✅ | ✅ |
| webdav | community | ✅ | ✅ |
| whoogle | community | ✅ | ✅ |
| wordpress | community | ✅ | ✅ |
| zerotier | community | ✅ | ✅ |
| minio | enterprise | ✅ | ✅ |
| syncthing | enterprise | ✅ | ✅ |
</details>
================================================
FILE: catalog.json
================================================
{
"stable": {
"wg-easy": {
"app_readme": "<h1>WG-Easy</h1> <p><a href=\"https://github.com/wg-easy/wg-easy\">WG-Easy (WireGuard Easy)</a> is the easiest way to install & manage WireGuard!</p>",
"categories": [
"networking"
],
"description": "WG-Easy is the easiest way to install & manage WireGuard!",
"healthy": true,
"healthy_error": null,
"home": "https://github.com/wg-easy/wg-easy",
"location": "/__w/apps/apps/trains/stable/wg-easy",
"latest_version": "2.1.5",
"latest_app_version": "15.2.2",
"latest_human_version": "15.2.2_2.1.5",
"last_update": "2026-04-27 11:53:24",
"name": "wg-easy",
"recommended": false,
"title": "WG Easy",
"maintainers": [
{
"email": "dev@truenas.com",
"name": "truenas",
"url": "https://www.truenas.com/"
}
],
"tags": [
"wireguard",
"network",
"vpn"
],
"screenshots": [
"https://media.sys.truenas.net/apps/wg-easy/screenshots/screenshot1.png"
],
"sources": [
"https://github.com/wg-easy/wg-easy"
],
"icon_url": "https://media.sys.truenas.net/apps/wg-easy/icons/icon.png",
"capabilities": [
{
"description": "WG Easy is able to perform network administration tasks",
"name": "NET_ADMIN"
},
{
"description": "WG Easy is able to use raw and packet sockets",
"name": "NET_RAW"
},
{
"description": "WG Easy is able to load and unload kernel modules",
"name": "SYS_MODULE"
}
],
"run_as_context": [
{
"description": "Container [wg-easy] runs as root user and group.",
"gid": 0,
"group_name": "Host group is [root]",
"uid": 0,
"user_name": "Host user is [root]"
}
]
},
"ix-app": {
"app_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>",
"categories": [
"custom"
],
"description": "An application for deploying simple containers.",
"healthy": true,
"healthy_error": null,
"home": "https://www.truenas.com/",
"location": "/__w/apps/apps/trains/stable/ix-app",
"latest_version": "1.4.3",
"latest_app_version": "1.4.0",
"latest_human_version": "1.4.0_1.4.3",
"last_update": "2026-04-27 11:53:24",
"name": "ix-app",
"recommended": false,
"title": "iX App",
"maintainers": [
{
"email": "dev@truenas.com",
"name": "truenas",
"url": "https://www.truenas.com/"
}
],
"tags": [],
"screenshots": [],
"sources": [],
"icon_url": "https://media.sys.truenas.net/apps/ix-app/icons/icon.webp",
"capabilities": [],
"run_as_context": []
},
"netdata": {
"app_readme": "<h1>Netdata</h1> <p><a href=\"https://www.netdata.cloud/\">Netdata</a> is a fast, easy monitoring and troubleshooting system.</p>",
"categories": [
"monitoring"
],
"description": "Real-time performance monitoring, done right!",
"healthy": true,
"healthy_error": null,
"home": "https://www.netdata.cloud/",
"location": "/__w/apps/apps/trains/stable/netdata",
"latest_version": "1.4.10",
"latest_app_version": "v2.10.3",
"latest_human_version": "v2.10.3_1.4.10",
"last_update": "2026-04-27 17:09:28",
"name": "netdata",
"recommended": false,
"title": "Netdata",
"maintainers": [
{
"email": "dev@truenas.com",
"name": "truenas",
"url": "https://www.truenas.com/"
}
],
"tags": [
"alerting",
"metric",
"monitoring"
],
"screenshots": [
"https://media.sys.truenas.net/apps/netdata/screenshots/screenshot1.png",
"https://media.sys.truenas.net/apps/netdata/screenshots/screenshot2.png",
"https://media.sys.truenas.net/apps/netdata/screenshots/screenshot3.png"
],
"sources": [
"https://www.netdata.cloud/",
"https://github.com/netdata/helmchart",
"https://hub.docker.com/r/netdata/netdata",
"https://github.com/netdata/netdata"
],
"icon_url": "https://media.sys.truenas.net/apps/netdata/icons/icon.png",
"capabilities": [
{
"description": "Netdata is able to change file ownership arbitrarily",
"name": "CHOWN"
},
{
"description": "Netdata is able to bypass file permission checks",
"name": "DAC_OVERRIDE"
},
{
"description": "Netdata is able to bypass permission checks for file operations",
"name": "FOWNER"
},
{
"description": "Netdata is able to change group ID of processes",
"name": "SETGID"
},
{
"description": "Netdata is able to change user ID of processes",
"name": "SETUID"
},
{
"description": "Netdata is able to trace and control other processes",
"name": "SYS_PTRACE"
},
{
"description": "Netdata is able to perform raw I/O operations",
"name": "SYS_RAWIO"
}
],
"run_as_context": [
{
"description": "Container [netdata] runs as root user and group.",
"gid": 0,
"group_name": "Host group is [root]",
"uid": 0,
"user_name": "Host user is [root]"
}
]
},
"collabora": {
"app_readme": "<h1>Collabora</h1> <p><a href=\"https://www.collaboraoffice.com/\">Collabora</a> is a collaborative online office suite based on LibreOffice technology</p>",
"categories": [
"productivity"
],
"description": "Collabora is a collaborative online office suite based on LibreOffice technology",
"healthy": true,
"healthy_error": null,
"home": "https://www.collaboraoffice.com/",
"location": "/__w/apps/apps/trains/stable/collabora",
"latest_version": "1.5.11",
"latest_app_version": "25.04.9.4.1",
"latest_human_version": "25.04.9.4.1_1.5.11",
"last_update": "2026-04-27 11:53:24",
"name": "collabora",
"recommended": false,
"title": "Collabora",
"maintainers": [
{
"email": "dev@truenas.com",
"name": "truenas",
"url": "https://www.truenas.com/"
}
],
"tags": [
"office",
"documents",
"productivity"
],
"screenshots": [
"https://media.sys.truenas.net/apps/collabora/screenshots/screenshot1.png"
],
"sources": [
"https://www.collaboraoffice.com/",
"https://github.com/CollaboraOnline/online",
"https://hub.docker.com/r/collabora/code"
],
"icon_url": "https://media.sys.truenas.net/apps/collabora/icons/icon.png",
"capabilities": [
{
"description": "Collabora, Nginx are able to change file ownership arbitrarily",
"name": "CHOWN"
},
{
"description": "Nginx is able to bypass file permission checks",
"name": "DAC_OVERRIDE"
},
{
"description": "Collabora, Nginx are able to bypass permission checks for file operations",
"name": "FOWNER"
},
{
"description": "Nginx is able to change group ID of processes",
"name": "SETGID"
},
{
"description": "Nginx is able to change user ID of processes",
"name": "SETUID"
},
{
"description": "Collabora is able to perform system administration operations",
"name": "SYS_ADMIN"
},
{
"description": "Collabora is able to use chroot() system call",
"name": "SYS_CHROOT"
}
],
"run_as_context": [
{
"description": "Container [collabora] runs as non-root user and group.",
"gid": 1001,
"group_name": "Host group is [unknown (1001)]",
"uid": 1001,
"user_name": "Host user is [unknown (1001)]"
},
{
"description": "Container [nginx] runs as root user and group.",
"gid": 0,
"group_name": "Host group is [root]",
"uid": 0,
"user_name": "Host user is [root]"
}
]
},
"nextcloud": {
"app_readme": "<h1>Nextcloud</h1> <p><a href=\"https://nextcloud.com/\">Nextcloud</a> is a file sharing server that puts the control and security of your own data back into your hands.</p>",
"categories": [
"productivity"
],
"description": "A file sharing server that puts the control and security of your own data back into your hands.",
"healthy": true,
"healthy_error": null,
"home": "https://nextcloud.com/",
"location": "/__w/apps/apps/trains/stable/nextcloud",
"latest_version": "2.3.22",
"latest_app_version": "33.0.2",
"latest_human_version": "33.0.2_2.3.22",
"last_update": "2026-04-27 11:53:24",
"name": "nextcloud",
"recommended": false,
"title": "Nextcloud",
"maintainers": [
{
"email": "dev@truenas.com",
"name": "truenas",
"url": "https://www.truenas.com/"
}
],
"tags": [
"nextcloud",
"storage",
"sync",
"http",
"web",
"php"
],
"screenshots": [
"https://media.sys.truenas.net/apps/nextcloud/screenshots/screenshot1.png",
"https://media.sys.truenas.net/apps/nextcloud/screenshots/screenshot2.png",
"https://media.sys.truenas.net/apps/nextcloud/screenshots/screenshot3.png"
],
"sources": [
"https://github.com/nextcloud/docker"
],
"icon_url": "https://media.sys.truenas.net/apps/nextcloud/icons/icon.svg",
"capabilities": [
{
"description": "Cron, Nextcloud, Nginx are able to change file ownership arbitrarily",
"name": "CHOWN"
},
{
"description": "Cron, Nextcloud, Nginx are able to bypass file permission checks",
"name": "DAC_OVERRIDE"
},
{
"description": "Cron, Nextcloud, Nginx are able to bypass permission checks for file operations",
"name": "FOWNER"
},
{
"description": "Cron, Nextcloud, Nginx are able to bind to privileged ports (< 1024)",
"name": "NET_BIND_SERVICE"
},
{
"description": "Cron, Nextcloud, Nginx are able to use raw and packet sockets",
"name": "NET_RAW"
},
{
"description": "Cron, Nextcloud, Nginx are able to change group ID of processes",
"name": "SETGID"
},
{
"description": "Cron, Nextcloud, Nginx are able to change user ID of processes",
"name": "SETUID"
},
{
"description": "Imaginary is able to modify process scheduling priority",
"name": "SYS_NICE"
}
],
"run_as_context": [
{
"description": "Container [cron] runs as root user and group.",
"gid": 0,
"group_name": "Host group is [root]",
"uid": 0,
"user_name": "Host user is [root]"
},
{
"description": "Container [imaginary] can run as any non-root user and group.",
"gid": 568,
"group_name": "Host group is [apps]",
"uid": 568,
"user_name": "Host user is [apps]"
},
{
"description": "Container [nextcloud] runs as root user and group.",
"gid": 0,
"group_name": "Host group is [root]",
"uid": 0,
"user_name": "Host user is [root]"
},
{
"description": "Container [nginx] runs as root user and group.",
"gid": 0,
"group_name": "Host group is [root]",
"uid": 0,
"user_name": "Host user is [root]"
},
{
"description": "Container [postgres] runs as non-root user and group.",
"gid": 999,
"group_name": "Host group is [docker]",
"uid": 999,
"user_name": "Host user is [netdata]"
},
{
"description": "Container [redis] can run as any non-root user and group.",
"gid": 568,
"group_name": "Host group is [apps]",
"uid": 568,
"user_name": "Host user is [apps]"
}
]
},
"aistor": {
"app_readme": "<h1>AIStor</h1> <p><a href=\"https://min.io\">AIStor</a> delivers unmatched enterprise performance, scale, agility and economics for AI data, agentic computing, and analytics.</p>",
"categories": [
"storage"
],
"description": "The Object Store for AI Data Infrastructure",
"healthy": true,
"healthy_error": null,
"home": "https://www.min.io/",
"location": "/__w/apps/apps/trains/stable/aistor",
"latest_version": "1.1.11",
"latest_app_version": "RELEASE.2026-04-14T21-32-45Z",
"latest_human_version": "RELEASE.2026-04-14T21-32-45Z_1.1.11",
"last_update": "2026-04-27 11:53:24",
"name": "aistor",
"recommended": false,
"title": "AIStor",
"maintainers": [
{
"email": "dev@truenas.com",
"name": "truenas",
"url": "https://www.truenas.com/"
}
],
"tags": [
"storage",
"object-storage",
"S3"
],
"screenshots": [],
"sources": [
"https://quay.io/repository/minio/aistor/minio",
"https://docs.min.io/enterprise/aistor-object-store/installation/container/install/"
],
"icon_url": "https://media.sys.truenas.net/apps/minio/icons/icon.png",
"capabilities": [],
"run_as_context": [
{
"description": "Container [aistor] can run as any non-root user and group.",
"gid": 568,
"group_name": "Host group is [apps]",
"uid": 568,
"user_name": "Host user is [apps]"
}
]
},
"diskoverdata": {
"app_readme": "<h1>Diskover Data</h1> <p><a href=\"https://github.com/diskoverdata/diskover-community\">Diskover Data</a> is used to monitor size/volumes of distributed dataset.</p>",
"categories": [
"monitoring"
],
"description": "Diskover is used to monitor size/volumes of distributed dataset.",
"healthy": true,
"healthy_error": null,
"home": "https://github.com/diskoverdata/diskover-community",
"location": "/__w/apps/apps/trains/stable/diskoverdata",
"latest_version": "1.8.6",
"latest_app_version": "2.3.5",
"latest_human_version": "2.3.5_1.8.6",
"last_update": "2026-04-27 11:53:24",
"name": "diskoverdata",
"recommended": false,
"title": "Diskover Data",
"maintainers": [
{
"email": "dev@truenas.com",
"name": "truenas",
"url": "https://www.truenas.com/"
}
],
"tags": [
"storage",
"monitoring",
"management",
"discovery"
],
"screenshots": [
"https://media.sys.truenas.net/apps/diskoverdata/screenshots/screenshot1.png",
"https://media.sys.truenas.net/apps/diskoverdata/screenshots/screenshot2.png",
"https://media.sys.truenas.net/apps/diskoverdata/screenshots/screenshot3.png"
],
"sources": [
"https://github.com/diskoverdata/diskover-community",
"https://github.com/linuxserver/docker-diskover"
],
"icon_url": "https://media.sys.truenas.net/apps/diskoverdata/icons/icon.png",
"capabilities": [
{
"description": "Diskover Data is able to change file ownership arbitrarily",
"name": "CHOWN"
},
{
"description": "Diskover Data is able to bypass file permission checks",
"name": "DAC_OVERRIDE"
},
{
"description": "Diskover Data is able to bypass permission checks for file operations",
"name": "FOWNER"
},
{
"description": "Diskover Data is able to bind to privileged ports (< 1024)",
"name": "NET_BIND_SERVICE"
},
{
"description": "Diskover Data is able to change group ID of processes",
"name": "SETGID"
},
{
"description": "Diskover Data is able to change user ID of processes",
"name": "SETUID"
}
],
"run_as_context": [
{
"description": "Container [diskoverdata] runs as root user and group.",
"gid": 0,
"group_name": "Host group is [root]",
"uid": 0,
"user_name": "Host user is [root]"
},
{
"description": "Container [elastic-search] runs as non-root user and group.",
"gid": 1000,
"group_name": "Host group is [unknown (1000)]",
"uid": 1000,
"user_name": "Host user is [unknown (1000)]"
}
]
},
"syncthing": {
"app_readme": "<h1>Syncthing</h1> <p><a href=\"https://syncthing.net/\">Syncthing</a> is a continuous file synchronization program. It synchronizes files between two or more computers in real time, safely protected from prying eyes. Your data is your data alone and you deserve to choose where it is stored, whether it is shared with some third party, and how it's transmitted over the internet.</p> <blockquote> <p><strong>WARNING</strong> Do check out <a href=\"https://docs.syncthing.net/users/faq.html#what-things-are-synced\">official docs<
Showing preview only (4,197K chars total). Download the full file or copy to clipboard to get everything.
gitextract_paekjaim/ ├── .flake8 ├── .gitattributes ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── app-request.yaml │ │ ├── bug-report.yaml │ │ └── enhancement-request.yaml │ ├── PULL_REQUEST_TEMPLATE/ │ │ └── app_addition.md │ ├── copilot-instructions.md │ ├── pull_request_template.md │ ├── renovate-config.js │ ├── renovate.json │ ├── scripts/ │ │ ├── changed_apps.py │ │ ├── ci.py │ │ ├── generate_metadata.py │ │ ├── message.py │ │ ├── port_validation.py │ │ └── renovate_bump.sh │ └── workflows/ │ ├── app-test-suite.yaml │ ├── dev_apps_validate.yml │ ├── library-tests.yaml │ ├── python-lint.yaml │ ├── renovate.yaml │ └── update_catalog.yaml ├── .gitignore ├── CONTRIBUTIONS.md ├── LICENSE ├── README.md ├── catalog.json ├── cspell.config.yaml ├── devbox.json ├── features_capability.json ├── ix-dev/ │ ├── community/ │ │ ├── actual-budget/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── app_migrations.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── migrations/ │ │ │ │ └── ip_port_migration │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ ├── basic-values.yaml │ │ │ ├── hostnet-values.yaml │ │ │ └── https-values.yaml │ │ ├── adguard-home/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── app_migrations.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── migrations/ │ │ │ │ └── ip_port_migration │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ ├── basic-values.yaml │ │ │ └── dhcp-values.yaml │ │ ├── adventurelog/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── app_migrations.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── migrations/ │ │ │ │ └── set_default_postgis_image │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── affine/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── aiostreams/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── anki-sync-server/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── app_migrations.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── migrations/ │ │ │ │ └── rename_web_port │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── anything-llm/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ ├── basic-values.yaml │ │ │ └── https-values.yaml │ │ ├── arcane/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── archisteamfarm/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── arti/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ ├── macros/ │ │ │ │ └── setup.py.jinja │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── audiobookshelf/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── app_migrations.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── migrations/ │ │ │ │ ├── ip_port_migration │ │ │ │ └── remove_host_net │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── authelia/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── authentik/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── app_migrations.yaml │ │ │ ├── deprecations.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── migrations/ │ │ │ │ ├── enable_deprecated_media │ │ │ │ ├── remove_deprecated_media │ │ │ │ └── remove_redis │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── autobrr/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── app_migrations.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── migrations/ │ │ │ │ └── ip_port_migration │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── automatic-ripping-machine/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── autoxpose/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── backrest/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── baserow/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── bazarr/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── app_migrations.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── migrations/ │ │ │ │ └── ip_port_migration │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── bentopdf/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── beszel-hub/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── bichon/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── bitcoind/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── app_migrations.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── migrations/ │ │ │ │ └── remove_max_orphan_txs │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ ├── macros/ │ │ │ │ └── setup.py.jinja │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── bitcoind-knots/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ ├── macros/ │ │ │ │ └── setup.py.jinja │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── bitmagnet/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── blinko/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── bookshelf/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ ├── basic-values.yaml │ │ │ └── softcover-values.yaml │ │ ├── bookstack/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── borgwarehouse/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── boxarr/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── briefkasten/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── app_migrations.yaml │ │ │ ├── deprecations.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── migrations/ │ │ │ │ └── ip_port_migration │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ ├── basic-values.yaml │ │ │ └── extra-values.yaml │ │ ├── byparr/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── calibre/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── app_migrations.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── migrations/ │ │ │ │ └── ip_port_migration │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── calibre-web/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── castopod/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── app_migrations.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── migrations/ │ │ │ │ └── ip_port_migration │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ ├── 2fa-values.yaml │ │ │ ├── basic-values.yaml │ │ │ └── redirect-values.yaml │ │ ├── change-detection/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── channels-dvr/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── app_migrations.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── migrations/ │ │ │ │ └── fix_run_as │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ ├── basic-values.yaml │ │ │ └── nvidia-values.yaml │ │ ├── chatwoot/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ ├── basic-values.yaml │ │ │ └── ce-values.yaml │ │ ├── chia/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── app_migrations.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── migrations/ │ │ │ │ └── ip_port_migration │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ ├── macros/ │ │ │ │ └── init.sh │ │ │ └── test_values/ │ │ │ ├── basic-values.yaml │ │ │ └── farmer-values.yaml │ │ ├── clamav/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── app_migrations.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── migrations/ │ │ │ │ └── ip_port_migration │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ ├── basic-values.yaml │ │ │ ├── milterd-values.yaml │ │ │ ├── no-clamd-values.yaml │ │ │ └── no-freshclamd-values.yaml │ │ ├── cleanuparr/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── cloudbeaver/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── cloudflared/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── app_migrations.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── migrations/ │ │ │ │ ├── remove_proxy_mode │ │ │ │ └── remove_tunnel_dns_field │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── cloudreve/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ ├── basic-values.yaml │ │ │ └── fts-values.yaml │ │ ├── cockpit-ws/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── code-server/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── app_migrations.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── migrations/ │ │ │ │ └── set_deprecated_volumes │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── concourse/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ ├── macros/ │ │ │ │ └── keys.sh │ │ │ └── test_values/ │ │ │ ├── basic-values.yaml │ │ │ └── https-values.yaml │ │ ├── continuwuity/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ ├── basic-values.yaml │ │ │ └── no-federation-values.yaml │ │ ├── convertx/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── coolify/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ └── basic-values.yaml │ │ ├── copyparty/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │ │ │ │ ├── functions.py │ │ │ │ ├── healthcheck.py │ │ │ │ ├── labels.py │ │ │ │ ├── networks.py │ │ │ │ ├── notes.py │ │ │ │ ├── portals.py │ │ │ │ ├── ports.py │ │ │ │ ├── render.py │ │ │ │ ├── resources.py │ │ │ │ ├── restart.py │ │ │ │ ├── security_opts.py │ │ │ │ ├── storage.py │ │ │ │ ├── sysctls.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_build_image.py │ │ │ │ │ ├── test_configs.py │ │ │ │ │ ├── test_container.py │ │ │ │ │ ├── test_depends.py │ │ │ │ │ ├── test_deps.py │ │ │ │ │ ├── test_device.py │ │ │ │ │ ├── test_device_cgroup_rules.py │ │ │ │ │ ├── test_dns.py │ │ │ │ │ ├── test_environment.py │ │ │ │ │ ├── test_expose.py │ │ │ │ │ ├── test_extra_hosts.py │ │ │ │ │ ├── test_formatter.py │ │ │ │ │ ├── test_functions.py │ │ │ │ │ ├── test_healthcheck.py │ │ │ │ │ ├── test_labels.py │ │ │ │ │ ├── test_networks.py │ │ │ │ │ ├── test_notes.py │ │ │ │ │ ├── test_portal.py │ │ │ │ │ ├── test_ports.py │ │ │ │ │ ├── test_render.py │ │ │ │ │ ├── test_resources.py │ │ │ │ │ ├── test_restart.py │ │ │ │ │ ├── test_security_opts.py │ │ │ │ │ ├── test_sysctls.py │ │ │ │ │ ├── test_truenas_client.py │ │ │ │ │ ├── test_validations.py │ │ │ │ │ └── test_volumes.py │ │ │ │ ├── tmpfs.py │ │ │ │ ├── truenas_client.py │ │ │ │ ├── validations.py │ │ │ │ ├── volume_mount.py │ │ │ │ ├── volume_mount_types.py │ │ │ │ ├── volume_sources.py │ │ │ │ ├── volume_types.py │ │ │ │ └── volumes.py │ │ │ └── test_values/ │ │ │ ├── basic-values.yaml │ │ │ ├── dj-values.yaml │ │ │ ├── https-values.yaml │ │ │ ├── im-values.yaml │ │ │ ├── iv-values.yaml │ │ │ └── min-values.yaml │ │ ├── crafty-4/ │ │ │ ├── README.md │ │ │ ├── app.yaml │ │ │ ├── item.yaml │ │ │ ├── ix_values.yaml │ │ │ ├── questions.yaml │ │ │ └── templates/ │ │ │ ├── docker-compose.yaml │ │ │ ├── library/ │ │ │ │ └── base_v2_3_4/ │ │ │ │ ├── __init__.py │ │ │ │ ├── configs.py │ │ │ │ ├── container.py │ │ │ │ ├── depends.py │ │ │ │ ├── deploy.py │ │ │ │ ├── deps.py │ │ │ │ ├── deps_cron.py │ │ │ │ ├── deps_elastic.py │ │ │ │ ├── deps_guacd.py │ │ │ │ ├── deps_mariadb.py │ │ │ │ ├── deps_meilisearch.py │ │ │ │ ├── deps_memcached.py │ │ │ │ ├── deps_mongodb.py │ │ │ │ ├── deps_perms.py │ │ │ │ ├── deps_postgres.py │ │ │ │ ├── deps_redis.py │ │ │ │ ├── deps_solr.py │ │ │ │ ├── deps_tika.py │ │ │ │ ├── device.py │ │ │ │ ├── device_cgroup_rules.py │ │ │ │ ├── devices.py │ │ │ │ ├── dns.py │ │ │ │ ├── docker_client.py │ │ │ │ ├── environment.py │ │ │ │ ├── error.py │ │ │ │ ├── expose.py │ │ │ │ ├── extra_hosts.py │ │ │ │ ├── formatter.py │
Copy disabled (too large)
Download .txt
Showing preview only (18,271K chars total). Download the full file to get everything.
SYMBOL INDEX (204591 symbols across 18354 files)
FILE: .github/renovate-config.js
function customVersioning (line 353) | function customVersioning(versioningRegex, packages) {
FILE: .github/scripts/changed_apps.py
function get_changed_files (line 16) | def get_changed_files():
function find_test_files (line 31) | def find_test_files(changed_files):
function main (line 79) | def main():
FILE: .github/scripts/ci.py
function print_stdout (line 26) | def print_stdout(msg):
function print_stderr (line 31) | def print_stderr(msg):
function parse_args (line 35) | def parse_args():
function print_info (line 86) | def print_info():
function command_exists (line 97) | def command_exists(command):
function check_required_commands (line 101) | def check_required_commands():
function get_base_cmd (line 109) | def get_base_cmd():
function pull_app_catalog_container (line 119) | def pull_app_catalog_container():
function fix_permissions (line 132) | def fix_permissions(file_path):
function render_compose (line 148) | def render_compose():
function update_x_portals (line 192) | def update_x_portals(parsed_compose):
function print_docker_compose_config (line 202) | def print_docker_compose_config():
function separator_start (line 227) | def separator_start():
function separator_end (line 231) | def separator_end():
function print_cmd (line 235) | def print_cmd(cmd):
function docker_cleanup (line 239) | def docker_cleanup():
function print_logs (line 253) | def print_logs():
function print_docker_processes (line 278) | def print_docker_processes():
function get_parsed_containers (line 286) | def get_parsed_containers():
function status_indicates_healthcheck_existence (line 303) | def status_indicates_healthcheck_existence(container):
function state_indicates_restarting (line 309) | def state_indicates_restarting(container):
function exit_code_indicates_normal_exit (line 314) | def exit_code_indicates_normal_exit(container):
function health_indicates_healthy (line 319) | def health_indicates_healthy(container):
function is_considered_healthy (line 327) | def is_considered_healthy(container):
function get_failed_containers (line 366) | def get_failed_containers():
function get_container_name (line 382) | def get_container_name(container):
function print_inspect_data (line 386) | def print_inspect_data(container):
function run_app (line 396) | def run_app():
function check_app_dir_exists (line 451) | def check_app_dir_exists():
function copy_lib (line 457) | def copy_lib():
function copy_macros (line 475) | def copy_macros():
function generate_item_file (line 493) | def generate_item_file():
function wait_for_user_input (line 508) | def wait_for_user_input():
function main (line 516) | def main():
FILE: .github/scripts/generate_metadata.py
class Config (line 29) | class Config:
class DockerCapability (line 55) | class DockerCapability:
method to_dict (line 61) | def to_dict(self) -> Dict[str, str]:
class AppAnalysisResult (line 66) | class AppAnalysisResult:
class AppManifest (line 76) | class AppManifest:
class DockerCapabilityRegistry (line 85) | class DockerCapabilityRegistry:
method service_name_to_title (line 276) | def service_name_to_title(service_name: str) -> str:
method hash_service_name (line 281) | def hash_service_name(service_name: str) -> str:
method uid_to_user_name (line 286) | def uid_to_user_name(cls, uid: int) -> str:
method gid_to_group_name (line 298) | def gid_to_group_name(cls, gid: int) -> str:
method create_capability_description (line 310) | def create_capability_description(cls, capability_name: str, service_n...
class FileSystemCache (line 341) | class FileSystemCache:
method __init__ (line 344) | def __init__(self):
method read_yaml_file (line 347) | def read_yaml_file(self, file_path: Path) -> Dict:
method write_yaml_file (line 380) | def write_yaml_file(self, file_path: Path, data: Dict) -> None:
method clear_cache (line 394) | def clear_cache(self) -> None:
class AppDiscoveryService (line 399) | class AppDiscoveryService:
method __init__ (line 402) | def __init__(self, apps_root_dir: str = Config.APPS_ROOT_DIR):
method discover_all_apps (line 405) | def discover_all_apps(self) -> List[AppManifest]:
method discover_single_app (line 425) | def discover_single_app(self, train_name: str, app_name: str) -> Optio...
method _discover_apps_in_train (line 430) | def _discover_apps_in_train(self, train_path: Path, train_name: str) -...
method _create_app_manifest (line 443) | def _create_app_manifest(self, app_path: Path, train_name: str) -> Opt...
class DockerComposeRenderer (line 471) | class DockerComposeRenderer:
method __init__ (line 474) | def __init__(self, container_image: str = Config.CONTAINER_IMAGE, plat...
method render_app_with_values (line 478) | def render_app_with_values(self, app_manifest: AppManifest, test_value...
method _fix_file_permissions (line 531) | def _fix_file_permissions(self, file_path: Path) -> None:
class DockerComposeAnalyzer (line 556) | class DockerComposeAnalyzer:
method extract_service_names (line 560) | def extract_service_names(compose_data: Dict, include_short_lived: boo...
method extract_capabilities_by_service (line 579) | def extract_capabilities_by_service(compose_data: Dict) -> Dict[str, S...
method extract_user_by_service (line 619) | def extract_user_by_service(compose_data: Dict) -> Dict[str, Tuple[int...
class AppQuestionsValidator (line 681) | class AppQuestionsValidator:
method __init__ (line 684) | def __init__(self, file_cache: FileSystemCache):
method validate_question (line 687) | def validate_question(self, question: Dict) -> None:
method validate_variable_names (line 719) | def validate_variable_names(self, app_manifest: AppManifest) -> None:
method validate_container_labels_section (line 732) | def validate_container_labels_section(self, app_manifest: AppManifest,...
class AppVersionManager (line 803) | class AppVersionManager:
method __init__ (line 806) | def __init__(self, file_cache: FileSystemCache, should_bump_versions: ...
method get_current_app_version (line 810) | def get_current_app_version(self, app_manifest: AppManifest) -> str:
method increment_patch_version (line 825) | def increment_patch_version(self, version: str) -> str:
class AppMetadataUpdater (line 841) | class AppMetadataUpdater:
method __init__ (line 844) | def __init__(self, file_cache: FileSystemCache, version_manager: AppVe...
method create_run_as_context (line 849) | def create_run_as_context(service_users: Dict[str, Tuple[int, int]]) -...
method update_app_metadata (line 896) | def update_app_metadata(
method _validate_app_configuration (line 958) | def _validate_app_configuration(self, app_manifest: AppManifest, app_c...
class TrueNASAppCapabilityManager (line 997) | class TrueNASAppCapabilityManager:
method __init__ (line 1000) | def __init__(self, should_bump_versions: bool = True):
method analyze_single_app (line 1011) | def analyze_single_app(self, app_manifest: AppManifest) -> AppAnalysis...
method update_single_app (line 1122) | def update_single_app(self, app_manifest: AppManifest) -> None:
method update_all_apps (line 1155) | def update_all_apps(self) -> None:
method update_specific_app (line 1180) | def update_specific_app(self, train_name: str, app_name: str) -> None:
function parse_command_line_arguments (line 1190) | def parse_command_line_arguments() -> argparse.Namespace:
function main (line 1202) | def main():
FILE: .github/scripts/message.py
function get_files_from_file (line 5) | def get_files_from_file(file: str):
function process (line 20) | def process(changed_files: list[str] | None = None, added_files: list[st...
function generate_message (line 60) | def generate_message(changes: dict | None = None):
function main (line 93) | def main():
FILE: .github/scripts/port_validation.py
function extract_ports_from_items (line 17) | def extract_ports_from_items(items):
function item_looks_like_port (line 28) | def item_looks_like_port(item):
function dict_looks_like_port (line 41) | def dict_looks_like_port(attrs):
function extract_ports (line 48) | def extract_ports(quests):
function scan_directory (line 73) | def scan_directory(path: str, current_depth: int = 0, to_depth: int = 2):
function get_current_port_map (line 87) | def get_current_port_map():
function main (line 107) | def main():
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/configs.py
class Configs (line 16) | class Configs:
method __init__ (line 17) | def __init__(self, render_instance: "Render"):
method add (line 21) | def add(self, name: str, data: str):
method has_configs (line 37) | def has_configs(self):
method render (line 40) | def render(self):
class ContainerConfigs (line 47) | class ContainerConfigs:
method __init__ (line 48) | def __init__(self, render_instance: "Render", configs: Configs):
method add (line 53) | def add(self, name: str, data: str, target: str, mode: str = ""):
method has_configs (line 66) | def has_configs(self):
method render (line 69) | def render(self):
class ContainerConfig (line 73) | class ContainerConfig:
method __init__ (line 74) | def __init__(self, render_instance: "Render", source: str, target: str...
method render (line 80) | def render(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/container.py
class Container (line 73) | class Container:
method __init__ (line 74) | def __init__(self, render_instance: "Render", name: str, image: str):
method _auto_add_groups (line 124) | def _auto_add_groups(self):
method _auto_set_network_mode (line 127) | def _auto_set_network_mode(self):
method _auto_add_labels (line 131) | def _auto_add_labels(self):
method _auto_add_networks (line 144) | def _auto_add_networks(self):
method _resolve_image (line 158) | def _resolve_image(self, image: str):
method name (line 174) | def name(self) -> str:
method build_image (line 177) | def build_image(self, content: list[str | None]):
method set_pull_policy (line 194) | def set_pull_policy(self, pull_policy: str):
method set_user (line 197) | def set_user(self, user: int, group: int):
method add_extra_host (line 203) | def add_extra_host(self, host: str, ip: str):
method add_group (line 206) | def add_group(self, group: int | str):
method get_additional_groups (line 216) | def get_additional_groups(self) -> list[int | str]:
method get_current_groups (line 223) | def get_current_groups(self) -> list[str]:
method set_tty (line 228) | def set_tty(self, enabled: bool = False):
method set_stdin (line 231) | def set_stdin(self, enabled: bool = False):
method set_ipc_mode (line 234) | def set_ipc_mode(self, ipc_mode: str):
method set_pid_mode (line 237) | def set_pid_mode(self, mode: str = ""):
method add_device_cgroup_rule (line 240) | def add_device_cgroup_rule(self, dev_grp_rule: str):
method set_cgroup (line 243) | def set_cgroup(self, cgroup: str):
method set_mac (line 246) | def set_mac(self, mac_address: str):
method set_init (line 250) | def set_init(self, enabled: bool = False):
method set_read_only (line 253) | def set_read_only(self, enabled: bool = False):
method set_hostname (line 256) | def set_hostname(self, hostname: str):
method set_grace_period (line 259) | def set_grace_period(self, grace_period: int):
method set_privileged (line 264) | def set_privileged(self, enabled: bool = False):
method clear_caps (line 267) | def clear_caps(self):
method add_caps (line 271) | def add_caps(self, caps: list[str]):
method add_security_opt (line 277) | def add_security_opt(self, key: str, value: str | bool | None = None, ...
method remove_security_opt (line 280) | def remove_security_opt(self, key: str):
method set_network_mode (line 283) | def set_network_mode(self, mode: str):
method add_port (line 286) | def add_port(self, port_config: dict | None = None, dev_config: dict |...
method set_entrypoint (line 313) | def set_entrypoint(self, entrypoint: list[str]):
method set_command (line 316) | def set_command(self, command: list[str]):
method add_network (line 319) | def add_network(self, network: str, config: dict = {}):
method add_storage (line 322) | def add_storage(self, mount_path: str, config: "IxStorage"):
method add_docker_socket (line 328) | def add_docker_socket(self, read_only: bool = True, mount_path: str = ...
method add_udev (line 332) | def add_udev(self, read_only: bool = True, mount_path: str = "/run/ude...
method add_tun_device (line 335) | def add_tun_device(self):
method add_snd_device (line 338) | def add_snd_device(self):
method add_usb_bus (line 342) | def add_usb_bus(self):
method setup_as_helper (line 345) | def setup_as_helper(self, profile: str = "low", disable_network: bool ...
method set_shm_size_mb (line 354) | def set_shm_size_mb(self, size: int):
method remove_devices (line 360) | def remove_devices(self):
method storage (line 365) | def storage(self):
method render (line 368) | def render(self) -> dict[str, Any]:
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/depends.py
class Depends (line 14) | class Depends:
method __init__ (line 15) | def __init__(self, render_instance: "Render"):
method add_dependency (line 19) | def add_dependency(self, name: str, condition: str):
method has_dependencies (line 30) | def has_dependencies(self):
method render (line 33) | def render(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/deploy.py
class Deploy (line 12) | class Deploy:
method __init__ (line 13) | def __init__(self, render_instance: "Render"):
method has_deploy (line 17) | def has_deploy(self):
method render (line 20) | def render(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/deps.py
class Deps (line 34) | class Deps:
method __init__ (line 35) | def __init__(self, render_instance: "Render"):
method perms (line 38) | def perms(self, name: str):
method postgres (line 41) | def postgres(self, name: str, image: str, config: PostgresConfig, perm...
method redis (line 44) | def redis(self, name: str, image: str, config: RedisConfig, perms_inst...
method mariadb (line 47) | def mariadb(self, name: str, image: str, config: MariadbConfig, perms_...
method mongodb (line 50) | def mongodb(self, name: str, image: str, config: MongoDBConfig, perms_...
method meilisearch (line 53) | def meilisearch(self, name: str, image: str, config: MeiliConfig, perm...
method elasticsearch (line 56) | def elasticsearch(self, name: str, image: str, config: ElasticConfig, ...
method solr (line 59) | def solr(self, name: str, image: str, config: SolrConfig, perms_instan...
method tika (line 62) | def tika(self, name: str, image: str, config: TikaConfig):
method memcached (line 65) | def memcached(self, name: str, image: str, config: MemcachedConfig):
method guacd (line 68) | def guacd(self, name: str, image: str, config: GuacdConfig):
method cron (line 71) | def cron(self, name: str, image: str, config: CronConfig):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/deps_cron.py
class TasksConfig (line 14) | class TasksConfig(TypedDict):
class CronConfig (line 19) | class CronConfig(TypedDict):
class CronContainer (line 26) | class CronContainer:
method __init__ (line 28) | def __init__(self, render_instance: "Render", name: str, image: str, c...
method container (line 67) | def container(self):
method _get_repo (line 70) | def _get_repo(self, image):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/deps_elastic.py
class ElasticConfig (line 17) | class ElasticConfig(TypedDict):
class ElasticSearchContainer (line 27) | class ElasticSearchContainer:
method __init__ (line 28) | def __init__(
method container (line 76) | def container(self):
method _get_repo (line 79) | def _get_repo(self, image):
method get_port (line 92) | def get_port(self):
method get_url (line 95) | def get_url(self):
method get_snapshots_dir (line 98) | def get_snapshots_dir(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/deps_guacd.py
class GuacdConfig (line 14) | class GuacdConfig(TypedDict):
class GuacdContainer (line 21) | class GuacdContainer:
method __init__ (line 22) | def __init__(self, render_instance: "Render", name: str, image: str, c...
method container (line 49) | def container(self):
method _get_repo (line 52) | def _get_repo(self, image):
method get_port (line 63) | def get_port(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/deps_mariadb.py
class MariadbConfig (line 17) | class MariadbConfig(TypedDict):
class MariadbContainer (line 30) | class MariadbContainer:
method __init__ (line 31) | def __init__(
method _get_repo (line 69) | def _get_repo(self, image):
method get_url (line 80) | def get_url(self, variant: str):
method get_port (line 90) | def get_port(self):
method container (line 94) | def container(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/deps_meilisearch.py
class MeiliConfig (line 17) | class MeiliConfig(TypedDict):
class MeilisearchContainer (line 26) | class MeilisearchContainer:
method __init__ (line 27) | def __init__(
method container (line 69) | def container(self):
method _get_repo (line 72) | def _get_repo(self, image):
method get_port (line 85) | def get_port(self):
method get_url (line 88) | def get_url(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/deps_memcached.py
class MemcachedConfig (line 14) | class MemcachedConfig(TypedDict):
class MemcachedContainer (line 22) | class MemcachedContainer:
method __init__ (line 24) | def __init__(self, render_instance: "Render", name: str, image: str, c...
method container (line 52) | def container(self):
method _get_repo (line 55) | def _get_repo(self, image):
method get_port (line 66) | def get_port(self):
method get_address (line 69) | def get_address(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/deps_mongodb.py
class MongoDBConfig (line 18) | class MongoDBConfig(TypedDict):
class MongoDBContainer (line 28) | class MongoDBContainer:
method __init__ (line 29) | def __init__(
method container (line 70) | def container(self):
method _get_repo (line 73) | def _get_repo(self, image):
method get_port (line 84) | def get_port(self):
method get_url (line 87) | def get_url(self, variant: str):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/deps_perms.py
class PermsContainer (line 18) | class PermsContainer:
method __init__ (line 19) | def __init__(self, render_instance: "Render", name: str):
method add_or_skip_action (line 25) | def add_or_skip_action(self, identifier: str, volume_config: "IxStorag...
method parse_action (line 35) | def parse_action(self, identifier: str, volume_config: "IxStorage", ac...
method normalize_identifier_for_path (line 102) | def normalize_identifier_for_path(self, identifier: str):
method has_actions (line 105) | def has_actions(self):
method activate (line 108) | def activate(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/deps_postgres.py
class PostgresConfig (line 21) | class PostgresConfig(TypedDict):
function get_major_version (line 51) | def get_major_version(variant: str, tag: str):
class PostgresContainer (line 112) | class PostgresContainer:
method __init__ (line 113) | def __init__(
method container (line 193) | def container(self):
method add_dependency (line 196) | def add_dependency(self, container_name: str, condition: str):
method _get_repo (line 201) | def _get_repo(self, image):
method _get_target_version (line 212) | def _get_target_version(self, image):
method get_port (line 231) | def get_port(self):
method get_url (line 234) | def get_url(self, variant: str):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/deps_redis.py
class RedisConfig (line 18) | class RedisConfig(TypedDict):
class RedisContainer (line 27) | class RedisContainer:
method __init__ (line 28) | def __init__(
method _get_repo (line 70) | def _get_repo(self, image):
method get_port (line 81) | def get_port(self):
method get_url (line 84) | def get_url(self, variant: str):
method container (line 97) | def container(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/deps_solr.py
class SolrConfig (line 17) | class SolrConfig(TypedDict):
class SolrContainer (line 27) | class SolrContainer:
method __init__ (line 28) | def __init__(
method container (line 71) | def container(self):
method _get_repo (line 74) | def _get_repo(self, image):
method get_port (line 85) | def get_port(self):
method get_url (line 88) | def get_url(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/deps_tika.py
class TikaConfig (line 14) | class TikaConfig(TypedDict):
class TikaContainer (line 21) | class TikaContainer:
method __init__ (line 22) | def __init__(self, render_instance: "Render", name: str, image: str, c...
method container (line 49) | def container(self):
method _get_repo (line 52) | def _get_repo(self, image):
method get_port (line 63) | def get_port(self):
method get_url (line 66) | def get_url(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/device.py
class Device (line 9) | class Device:
method __init__ (line 10) | def __init__(self, host_device: str, container_device: str, cgroup_per...
method render (line 27) | def render(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/device_cgroup_rules.py
class DeviceCGroupRule (line 14) | class DeviceCGroupRule:
method __init__ (line 15) | def __init__(self, rule: str):
method get_key (line 25) | def get_key(self):
method render (line 28) | def render(self):
class DeviceCGroupRules (line 32) | class DeviceCGroupRules:
method __init__ (line 33) | def __init__(self, render_instance: "Render"):
method add_rule (line 38) | def add_rule(self, rule: str):
method has_rules (line 50) | def has_rules(self):
method render (line 53) | def render(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/devices.py
class Devices (line 14) | class Devices:
method __init__ (line 15) | def __init__(self, render_instance: "Render"):
method _auto_add_devices_from_values (line 25) | def _auto_add_devices_from_values(self):
method add_device (line 33) | def add_device(self, host_device: str, container_device: str, cgroup_p...
method add_usb_bus (line 42) | def add_usb_bus(self):
method _add_snd_device (line 45) | def _add_snd_device(self):
method _add_tun_device (line 48) | def _add_tun_device(self):
method has_devices (line 51) | def has_devices(self):
method remove_devices (line 57) | def remove_devices(self):
method has_gpus (line 64) | def has_gpus(self):
method render (line 70) | def render(self) -> list[str]:
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/dns.py
class Dns (line 14) | class Dns:
method __init__ (line 15) | def __init__(self, render_instance: "Render"):
method _get_dns_opt_keys (line 25) | def _get_dns_opt_keys(self):
method _get_key_from_opt (line 28) | def _get_key_from_opt(self, opt):
method _auto_add_dns_opts_from_values (line 31) | def _auto_add_dns_opts_from_values(self):
method _auto_add_dns_searches_from_values (line 36) | def _auto_add_dns_searches_from_values(self):
method _auto_add_dns_nameservers_from_values (line 41) | def _auto_add_dns_nameservers_from_values(self):
method add_dns_search (line 46) | def add_dns_search(self, dns_search):
method add_dns_nameserver (line 51) | def add_dns_nameserver(self, dns_nameserver):
method add_dns_opt (line 56) | def add_dns_opt(self, dns_opt):
method has_dns_opts (line 63) | def has_dns_opts(self):
method has_dns_searches (line 66) | def has_dns_searches(self):
method has_dns_nameservers (line 69) | def has_dns_nameservers(self):
method render_dns_searches (line 72) | def render_dns_searches(self):
method render_dns_opts (line 75) | def render_dns_opts(self):
method render_dns_nameservers (line 78) | def render_dns_nameservers(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/docker_client.py
class DockerClient (line 15) | class DockerClient:
method __init__ (line 16) | def __init__(self, render_instance: "Render"):
method _auto_fetch_networks (line 29) | def _auto_fetch_networks(self):
method network_exists (line 44) | def network_exists(self, network_name: str) -> bool:
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/environment.py
class Environment (line 15) | class Environment:
method __init__ (line 16) | def __init__(self, render_instance: "Render", resources: Resources):
method _auto_add_variables_from_values (line 31) | def _auto_add_variables_from_values(self):
method _add_generic_variables (line 36) | def _add_generic_variables(self):
method _add_nvidia_variables (line 53) | def _add_nvidia_variables(self):
method _format_value (line 60) | def _format_value(self, v: Any) -> str:
method remove_auto_env (line 69) | def remove_auto_env(self, name: str):
method add_env (line 75) | def add_env(self, name: str, value: Any):
method add_user_envs (line 84) | def add_user_envs(self, user_env: list[dict]):
method has_variables (line 94) | def has_variables(self):
method render (line 97) | def render(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/error.py
class RenderError (line 1) | class RenderError(Exception):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/expose.py
class Expose (line 14) | class Expose:
method __init__ (line 15) | def __init__(self, render_instance: "Render"):
method add_port (line 19) | def add_port(self, port: int, protocol: str = "tcp"):
method has_ports (line 27) | def has_ports(self):
method render (line 30) | def render(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/extra_hosts.py
class ExtraHosts (line 13) | class ExtraHosts:
method __init__ (line 14) | def __init__(self, render_instance: "Render"):
method add_host (line 18) | def add_host(self, host: str, ip: str):
method has_hosts (line 29) | def has_hosts(self):
method render (line 32) | def render(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/formatter.py
function escape_dollar (line 5) | def escape_dollar(text: str) -> str:
function get_hashed_name_for_volume (line 9) | def get_hashed_name_for_volume(prefix: str, config: dict):
function get_hash_with_prefix (line 14) | def get_hash_with_prefix(prefix: str, data: str):
function merge_dicts_no_overwrite (line 18) | def merge_dicts_no_overwrite(dict1, dict2):
function get_image_with_hashed_data (line 25) | def get_image_with_hashed_data(image: str, data: str):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/functions.py
class Functions (line 21) | class Functions:
method __init__ (line 22) | def __init__(self, render_instance: "Render"):
method _to_yaml (line 25) | def _to_yaml(self, data):
method _bcrypt_hash (line 28) | def _bcrypt_hash(self, password: str, rounds: int = 12):
method _htpasswd (line 37) | def _htpasswd(self, username: str, password: str, rounds: int = 12):
method _secure_string (line 41) | def _secure_string(self, length):
method _basic_auth (line 44) | def _basic_auth(self, username, password):
method _basic_auth_header (line 47) | def _basic_auth_header(self, username, password):
method _fail (line 50) | def _fail(self, message):
method _camel_case (line 53) | def _camel_case(self, string):
method _auto_cast (line 56) | def _auto_cast(self, value):
method _match_regex (line 72) | def _match_regex(self, value, regex):
method _must_match_regex (line 77) | def _must_match_regex(self, value, regex):
method _is_boolean (line 82) | def _is_boolean(self, string):
method _is_number (line 85) | def _is_number(self, string):
method _copy_dict (line 92) | def _copy_dict(self, dict):
method _deep_merge (line 95) | def _deep_merge(self, dict1: dict, dict2: dict):
method _disallow_chars (line 113) | def _disallow_chars(self, string: str, chars: list[str], key: str):
method _or_default (line 119) | def _or_default(self, value, default):
method _url_to_dict (line 124) | def _url_to_dict(self, url: str, v6_brackets: bool = False):
method _require_unique (line 157) | def _require_unique(self, values, key, split_char=""):
method _require_no_reserved (line 165) | def _require_no_reserved(self, values, key, reserved, split_char="", s...
method _url_encode (line 181) | def _url_encode(self, string):
method _temp_config (line 184) | def _temp_config(self, name):
method _get_host_path (line 189) | def _get_host_path(self, storage):
method has_amd_gpu (line 210) | def has_amd_gpu(self):
method has_nvidia_gpu (line 216) | def has_nvidia_gpu(self):
method func_map (line 224) | def func_map(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/healthcheck.py
class Healthcheck (line 17) | class Healthcheck:
method __init__ (line 18) | def __init__(self, render_instance: "Render"):
method _get_test (line 29) | def _get_test(self):
method disable (line 34) | def disable(self):
method use_built_in (line 37) | def use_built_in(self):
method set_custom_test (line 40) | def set_custom_test(self, test: str | list[str]):
method set_test (line 48) | def set_test(self, variant: str, config: dict | None = None):
method set_interval (line 52) | def set_interval(self, interval: int):
method set_timeout (line 55) | def set_timeout(self, timeout: int):
method set_retries (line 58) | def set_retries(self, retries: int):
method set_start_period (line 61) | def set_start_period(self, start_period: int):
method set_start_interval (line 64) | def set_start_interval(self, start_interval: int):
method has_healthcheck (line 67) | def has_healthcheck(self):
method render (line 70) | def render(self):
function test_mapping (line 90) | def test_mapping(variant: str, config: dict | None = None) -> list[str]:
function get_key (line 112) | def get_key(config: dict, key: str, default: Any, required: bool):
function curl_test (line 120) | def curl_test(config: dict) -> list[str]:
function wget_test (line 147) | def wget_test(config: dict) -> list[str]:
function http_test (line 189) | def http_test(config: dict) -> list[str]:
function netcat_test (line 199) | def netcat_test(config: dict) -> list[str]:
function tcp_test (line 214) | def tcp_test(config: dict) -> list[str]:
function redis_test (line 222) | def redis_test(config: dict) -> list[str]:
function postgres_test (line 237) | def postgres_test(config: dict) -> list[str]:
function mariadb_test (line 247) | def mariadb_test(config: dict) -> list[str]:
function mongodb_test (line 264) | def mongodb_test(config: dict) -> list[str]:
function pidof_test (line 284) | def pidof_test(config: dict) -> list[str]:
function pgrep_test (line 292) | def pgrep_test(config: dict) -> list[str]:
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/labels.py
class Labels (line 11) | class Labels:
method __init__ (line 12) | def __init__(self):
method add_label (line 15) | def add_label(self, key: str, value: str):
method has_labels (line 23) | def has_labels(self) -> bool:
method render (line 26) | def render(self) -> dict[str, str]:
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/networks.py
class Networks (line 17) | class Networks:
method __init__ (line 18) | def __init__(self, render_instance: "Render"):
method _auto_set_app_name (line 25) | def _auto_set_app_name(self):
method create_internal (line 31) | def create_internal(self, name: str) -> str:
method register (line 52) | def register(self, name: str):
method has_items (line 68) | def has_items(self):
method exists (line 71) | def exists(self, name: str):
method render (line 74) | def render(self):
class NetworkConfig (line 82) | class NetworkConfig:
method __post_init__ (line 94) | def __post_init__(self):
class Network (line 107) | class Network:
method __init__ (line 108) | def __init__(self, name: str, config: dict = {}):
method render (line 112) | def render(self):
class ContainerNetworkConfig (line 131) | class ContainerNetworkConfig:
class ContainerNetworks (line 148) | class ContainerNetworks:
method __init__ (line 149) | def __init__(self, render_instance: "Render"):
method add (line 153) | def add(self, container_name: str, net_name: str, config: dict = {}):
method has_items (line 218) | def has_items(self):
method exists (line 221) | def exists(self, name: str):
method render (line 224) | def render(self):
class ContainerNetwork (line 231) | class ContainerNetwork:
method __init__ (line 232) | def __init__(self, name: str, config: dict = {}):
method render (line 236) | def render(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/notes.py
class Security (line 11) | class Security:
class Notes (line 16) | class Notes:
method __init__ (line 17) | def __init__(self, render_instance: "Render"):
method _is_enterprise_train (line 33) | def _is_enterprise_train(self):
method _auto_set_app_name (line 37) | def _auto_set_app_name(self):
method _auto_set_app_train (line 41) | def _auto_set_app_train(self):
method _auto_set_footer (line 45) | def _auto_set_footer(self):
method _set_header (line 54) | def _set_header(self):
method add_info (line 61) | def add_info(self, info: str):
method add_warning (line 64) | def add_warning(self, warning: str):
method _prepend_warning (line 67) | def _prepend_warning(self, warning: str):
method add_deprecation (line 70) | def add_deprecation(self, deprecation: str):
method has_deprecations (line 73) | def has_deprecations(self) -> bool:
method has_warnings (line 76) | def has_warnings(self) -> bool:
method set_body (line 79) | def set_body(self, body: str):
method get_pretty_host_mount (line 82) | def get_pretty_host_mount(self, hm: str) -> tuple[str, bool]:
method get_group_name_from_id (line 118) | def get_group_name_from_id(self, group_id: int | str) -> str:
method scan_containers (line 131) | def scan_containers(self):
method render (line 246) | def render(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/portals.py
class Portals (line 16) | class Portals:
method __init__ (line 17) | def __init__(self, render_instance: "Render"):
method add (line 21) | def add(self, port: dict, config: dict | None = None):
method render (line 54) | def render(self):
class Portal (line 58) | class Portal:
method __init__ (line 59) | def __init__(self, name: str, config: dict):
method render (line 66) | def render(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/ports.py
class Ports (line 27) | class Ports:
method __init__ (line 28) | def __init__(self, render_instance: "Render"):
method _gen_port_key (line 34) | def _gen_port_key(self, host_port: int, host_ip: str, proto: str, ip_f...
method _is_wildcard_ip (line 37) | def _is_wildcard_ip(self, ip: str) -> bool:
method _get_opposite_wildcard (line 40) | def _get_opposite_wildcard(self, ip: str) -> str:
method _get_sort_key (line 43) | def _get_sort_key(self, p: dict) -> str:
method _is_ports_same (line 46) | def _is_ports_same(self, port1: dict, port2: dict) -> bool:
method _has_opposite_family_port (line 54) | def _has_opposite_family_port(self, port_config: dict, wildcard_ports:...
method _check_port_conflicts_in_this_app (line 62) | def _check_port_conflicts_in_this_app(self, port_config: dict, ip_fami...
method _add_port (line 101) | def _add_port(self, host_port: int, container_port: int, config: dict ...
method has_ports (line 126) | def has_ports(self):
method render (line 129) | def render(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/render.py
class Render (line 29) | class Render(object):
method __init__ (line 30) | def __init__(self, values):
method _auto_add_networks (line 50) | def _auto_add_networks(self):
method container_names (line 58) | def container_names(self):
method add_container (line 61) | def add_container(self, name: str, image: str):
method render (line 71) | def render(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/resources.py
class Resources (line 16) | class Resources:
method __init__ (line 17) | def __init__(self, render_instance: "Render"):
method _set_cpu (line 26) | def _set_cpu(self, cpus: Any):
method _set_memory (line 32) | def _set_memory(self, memory: Any):
method _auto_add_cpu_from_values (line 38) | def _auto_add_cpu_from_values(self):
method _auto_add_memory_from_values (line 42) | def _auto_add_memory_from_values(self):
method _auto_add_gpus_from_values (line 46) | def _auto_add_gpus_from_values(self):
method remove_cpus_and_memory (line 72) | def remove_cpus_and_memory(self):
method remove_devices (line 79) | def remove_devices(self):
method set_profile (line 82) | def set_profile(self, profile: str):
method has_resources (line 87) | def has_resources(self):
method has_gpus (line 90) | def has_gpus(self):
method render (line 94) | def render(self):
function profile_mapping (line 104) | def profile_mapping(profile: str):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/restart.py
class RestartPolicy (line 12) | class RestartPolicy:
method __init__ (line 13) | def __init__(self, render_instance: "Render"):
method set_policy (line 18) | def set_policy(self, policy: str, maximum_retry_count: int = 0):
method render (line 22) | def render(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/security_opts.py
class SecurityOpt (line 14) | class SecurityOpt:
method __init__ (line 15) | def __init__(self, opt: str, value: str | bool | None = None, arg: str...
method render (line 20) | def render(self):
class SecurityOpts (line 29) | class SecurityOpts:
method __init__ (line 30) | def __init__(self, render_instance: "Render"):
method add_opt (line 35) | def add_opt(self, key: str, value: str | bool | None, arg: str | None ...
method remove_opt (line 40) | def remove_opt(self, key: str):
method has_opts (line 45) | def has_opts(self):
method render (line 48) | def render(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/storage.py
class IxStorageTmpfsConfig (line 17) | class IxStorageTmpfsConfig(TypedDict):
class AclConfig (line 24) | class AclConfig(TypedDict, total=False):
class IxStorageHostPathConfig (line 28) | class IxStorageHostPathConfig(TypedDict):
class IxStorageIxVolumeConfig (line 37) | class IxStorageIxVolumeConfig(TypedDict):
class IxStorageVolumeConfig (line 46) | class IxStorageVolumeConfig(TypedDict):
class IxStorageNfsConfig (line 52) | class IxStorageNfsConfig(TypedDict):
class IxStorageCifsConfig (line 58) | class IxStorageCifsConfig(TypedDict):
class IxStorage (line 72) | class IxStorage(TypedDict):
class Storage (line 84) | class Storage:
method __init__ (line 85) | def __init__(self, render_instance: "Render", container_instance: "Con...
method add (line 90) | def add(self, mount_path: str, config: "IxStorage"):
method is_defined (line 100) | def is_defined(self, mount_path: str):
method _add_docker_socket (line 103) | def _add_docker_socket(self, read_only: bool = True, mount_path: str =...
method _add_udev (line 112) | def _add_udev(self, read_only: bool = True, mount_path: str = ""):
method has_mounts (line 121) | def has_mounts(self) -> bool:
method render (line 124) | def render(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/sysctls.py
class Sysctls (line 15) | class Sysctls:
method __init__ (line 16) | def __init__(self, render_instance: "Render", container_instance: "Con...
method add (line 21) | def add(self, key: str, value):
method has_sysctls (line 31) | def has_sysctls(self):
method render (line 34) | def render(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_build_image.py
function mock_values (line 7) | def mock_values():
function test_build_image_with_from (line 18) | def test_build_image_with_from(mock_values):
function test_build_image_with_from_with_whitespace (line 26) | def test_build_image_with_from_with_whitespace(mock_values):
function test_build_image (line 34) | def test_build_image(mock_values):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_configs.py
function mock_values (line 7) | def mock_values():
function test_add_duplicate_config_with_different_data (line 18) | def test_add_duplicate_config_with_different_data(mock_values):
function test_add_config_with_empty_target (line 27) | def test_add_config_with_empty_target(mock_values):
function test_add_config_with_empty_data (line 35) | def test_add_config_with_empty_data(mock_values):
function test_add_duplicate_target (line 43) | def test_add_duplicate_target(mock_values):
function test_add_config (line 52) | def test_add_config(mock_values):
function test_add_config_with_mode (line 62) | def test_add_config_with_mode(mock_values):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_container.py
function mock_values (line 8) | def mock_values():
function test_empty_container_name (line 19) | def test_empty_container_name(mock_values):
function test_resolve_image (line 25) | def test_resolve_image(mock_values):
function test_missing_repo (line 33) | def test_missing_repo(mock_values):
function test_missing_tag (line 40) | def test_missing_tag(mock_values):
function test_non_existing_image (line 47) | def test_non_existing_image(mock_values):
function test_pull_policy (line 53) | def test_pull_policy(mock_values):
function test_invalid_pull_policy (line 62) | def test_invalid_pull_policy(mock_values):
function test_clear_caps (line 69) | def test_clear_caps(mock_values):
function test_privileged (line 80) | def test_privileged(mock_values):
function test_tty (line 89) | def test_tty(mock_values):
function test_init (line 98) | def test_init(mock_values):
function test_read_only (line 107) | def test_read_only(mock_values):
function test_stdin (line 116) | def test_stdin(mock_values):
function test_hostname (line 125) | def test_hostname(mock_values):
function test_grace_period (line 134) | def test_grace_period(mock_values):
function test_user (line 143) | def test_user(mock_values):
function test_invalid_user (line 152) | def test_invalid_user(mock_values):
function test_add_group (line 160) | def test_add_group(mock_values):
function test_add_duplicate_group (line 170) | def test_add_duplicate_group(mock_values):
function test_add_group_as_string (line 179) | def test_add_group_as_string(mock_values):
function test_add_docker_socket (line 187) | def test_add_docker_socket(mock_values):
function test_snd_device (line 208) | def test_snd_device(mock_values):
function test_shm_size (line 218) | def test_shm_size(mock_values):
function test_valid_caps (line 227) | def test_valid_caps(mock_values):
function test_add_duplicate_caps (line 237) | def test_add_duplicate_caps(mock_values):
function test_invalid_caps (line 245) | def test_invalid_caps(mock_values):
function test_network_mode (line 253) | def test_network_mode(mock_values):
function test_auto_network_mode_with_host_network (line 262) | def test_auto_network_mode_with_host_network(mock_values):
function test_network_mode_with_container (line 271) | def test_network_mode_with_container(mock_values):
function test_network_mode_with_container_missing (line 280) | def test_network_mode_with_container_missing(mock_values):
function test_invalid_network_mode (line 288) | def test_invalid_network_mode(mock_values):
function test_entrypoint (line 296) | def test_entrypoint(mock_values):
function test_command (line 305) | def test_command(mock_values):
function test_add_ports (line 314) | def test_add_ports(mock_values):
function test_add_ports_with_invalid_host_ips (line 335) | def test_add_ports_with_invalid_host_ips(mock_values):
function test_add_ports_with_empty_host_ips (line 343) | def test_add_ports_with_empty_host_ips(mock_values):
function test_set_ipc_mode (line 354) | def test_set_ipc_mode(mock_values):
function test_set_ipc_empty_mode (line 363) | def test_set_ipc_empty_mode(mock_values):
function test_set_ipc_mode_with_invalid_ipc_mode (line 372) | def test_set_ipc_mode_with_invalid_ipc_mode(mock_values):
function test_set_ipc_mode_with_container_ipc_mode (line 380) | def test_set_ipc_mode_with_container_ipc_mode(mock_values):
function test_set_ipc_mode_with_container_ipc_mode_and_invalid_container (line 391) | def test_set_ipc_mode_with_container_ipc_mode_and_invalid_container(mock...
function test_set_pid_mode (line 399) | def test_set_pid_mode(mock_values):
function test_set_pid_empty_mode (line 408) | def test_set_pid_empty_mode(mock_values):
function test_set_pid_mode_with_invalid_pid_mode (line 417) | def test_set_pid_mode_with_invalid_pid_mode(mock_values):
function test_set_pid_mode_with_container_pid_mode (line 425) | def test_set_pid_mode_with_container_pid_mode(mock_values):
function test_set_pid_mode_with_container_pid_mode_and_invalid_container (line 436) | def test_set_pid_mode_with_container_pid_mode_and_invalid_container(mock...
function test_set_cgroup (line 444) | def test_set_cgroup(mock_values):
function test_set_cgroup_invalid (line 453) | def test_set_cgroup_invalid(mock_values):
function test_set_mac_invalid (line 461) | def test_set_mac_invalid(mock_values):
function test_set_mac_valid (line 469) | def test_set_mac_valid(mock_values):
function test_setup_as_helper (line 478) | def test_setup_as_helper(mock_values):
function test_setup_as_helper_med_profile (line 492) | def test_setup_as_helper_med_profile(mock_values):
function test_setup_as_helper_no_profile (line 506) | def test_setup_as_helper_no_profile(mock_values):
function test_setup_as_helper_with_net (line 520) | def test_setup_as_helper_with_net(mock_values):
function test_container_name (line 533) | def test_container_name(mock_values):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_depends.py
function mock_values (line 8) | def mock_values():
function test_add_dependency (line 19) | def test_add_dependency(mock_values):
function test_add_dependency_invalid_condition (line 30) | def test_add_dependency_invalid_condition(mock_values):
function test_add_dependency_missing_container (line 39) | def test_add_dependency_missing_container(mock_values):
function test_add_dependency_duplicate (line 47) | def test_add_dependency_duplicate(mock_values):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_deps.py
function mock_values (line 8) | def mock_values():
function test_add_postgres_missing_config (line 27) | def test_add_postgres_missing_config(mock_values):
function test_add_postgres_unsupported_repo (line 39) | def test_add_postgres_unsupported_repo(mock_values):
function test_add_postgres (line 59) | def test_add_postgres(mock_values):
function test_add_postgres_options (line 137) | def test_add_postgres_options(mock_values):
function test_add_redis_missing_config (line 165) | def test_add_redis_missing_config(mock_values):
function test_add_redis_unsupported_repo (line 177) | def test_add_redis_unsupported_repo(mock_values):
function test_add_redis_with_password_with_spaces (line 195) | def test_add_redis_with_password_with_spaces(mock_values):
function test_add_redis (line 208) | def test_add_redis(mock_values):
function test_add_mariadb_missing_config (line 279) | def test_add_mariadb_missing_config(mock_values):
function test_add_mariadb_unsupported_repo (line 291) | def test_add_mariadb_unsupported_repo(mock_values):
function test_add_mariadb (line 311) | def test_add_mariadb(mock_values):
function test_add_perms_container (line 380) | def test_add_perms_container(mock_values):
function test_add_duplicate_perms_action (line 488) | def test_add_duplicate_perms_action(mock_values):
function test_add_perm_action_without_auto_perms_enabled (line 500) | def test_add_perm_action_without_auto_perms_enabled(mock_values):
function test_add_unsupported_postgres_version (line 517) | def test_add_unsupported_postgres_version(mock_values):
function test_add_postgres_with_invalid_tag (line 530) | def test_add_postgres_with_invalid_tag(mock_values):
function test_postgres_with_upgrade_container (line 543) | def test_postgres_with_upgrade_container(mock_values):
function test_postgres_version_with_digest_pin (line 584) | def test_postgres_version_with_digest_pin(mock_values):
function test_add_mongodb (line 609) | def test_add_mongodb(mock_values):
function test_add_mongodb_unsupported_repo (line 679) | def test_add_mongodb_unsupported_repo(mock_values):
function test_add_meilisearch (line 699) | def test_add_meilisearch(mock_values):
function test_add_meilisearch_unsupported_repo (line 768) | def test_add_meilisearch_unsupported_repo(mock_values):
function test_add_elasticsearch (line 786) | def test_add_elasticsearch(mock_values):
function test_add_elasticsearch_unsupported_repo (line 865) | def test_add_elasticsearch_unsupported_repo(mock_values):
function test_add_solr (line 884) | def test_add_solr(mock_values):
function test_add_solr_unsupported_repo (line 953) | def test_add_solr_unsupported_repo(mock_values):
function test_add_tika (line 971) | def test_add_tika(mock_values):
function test_add_tika_unsupported_repo (line 1015) | def test_add_tika_unsupported_repo(mock_values):
function test_add_memcached (line 1028) | def test_add_memcached(mock_values):
function test_add_memcached_unsupported_repo (line 1073) | def test_add_memcached_unsupported_repo(mock_values):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_device.py
function mock_values (line 8) | def mock_values():
function test_add_device (line 19) | def test_add_device(mock_values):
function test_devices_without_host (line 29) | def test_devices_without_host(mock_values):
function test_devices_without_container (line 37) | def test_devices_without_container(mock_values):
function test_add_duplicate_device (line 45) | def test_add_duplicate_device(mock_values):
function test_add_device_with_invalid_container_path (line 54) | def test_add_device_with_invalid_container_path(mock_values):
function test_add_device_with_invalid_host_path (line 62) | def test_add_device_with_invalid_host_path(mock_values):
function test_add_disallowed_device (line 70) | def test_add_disallowed_device(mock_values):
function test_add_device_with_invalid_cgroup_perm (line 78) | def test_add_device_with_invalid_cgroup_perm(mock_values):
function test_automatically_add_gpu_devices (line 86) | def test_automatically_add_gpu_devices(mock_values):
function test_automatically_add_gpu_devices_and_kfd (line 96) | def test_automatically_add_gpu_devices_and_kfd(mock_values):
function test_remove_gpu_devices (line 106) | def test_remove_gpu_devices(mock_values):
function test_add_usb_bus (line 117) | def test_add_usb_bus(mock_values):
function test_add_usb_bus_disallowed (line 126) | def test_add_usb_bus_disallowed(mock_values):
function test_add_snd_device (line 134) | def test_add_snd_device(mock_values):
function test_add_tun_device (line 144) | def test_add_tun_device(mock_values):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_device_cgroup_rules.py
function mock_values (line 8) | def mock_values():
function test_device_cgroup_rule (line 19) | def test_device_cgroup_rule(mock_values):
function test_device_cgroup_rule_duplicate (line 32) | def test_device_cgroup_rule_duplicate(mock_values):
function test_device_cgroup_rule_duplicate_group (line 41) | def test_device_cgroup_rule_duplicate_group(mock_values):
function test_device_cgroup_rule_invalid_device (line 50) | def test_device_cgroup_rule_invalid_device(mock_values):
function test_device_cgroup_rule_invalid_perm (line 58) | def test_device_cgroup_rule_invalid_perm(mock_values):
function test_device_cgroup_rule_invalid_format (line 66) | def test_device_cgroup_rule_invalid_format(mock_values):
function test_device_cgroup_rule_invalid_format_missing_major (line 74) | def test_device_cgroup_rule_invalid_format_missing_major(mock_values):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_dns.py
function mock_values (line 8) | def mock_values():
function test_auto_add_dns_opts (line 19) | def test_auto_add_dns_opts(mock_values):
function test_auto_add_dns_searches (line 28) | def test_auto_add_dns_searches(mock_values):
function test_auto_add_dns_nameservers (line 37) | def test_auto_add_dns_nameservers(mock_values):
function test_add_duplicate_dns_nameservers (line 46) | def test_add_duplicate_dns_nameservers(mock_values):
function test_add_duplicate_dns_searches (line 53) | def test_add_duplicate_dns_searches(mock_values):
function test_add_duplicate_dns_opts (line 60) | def test_add_duplicate_dns_opts(mock_values):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_environment.py
function mock_values (line 8) | def mock_values():
function test_auto_add_vars (line 19) | def test_auto_add_vars(mock_values):
function test_skip_generic_variables (line 50) | def test_skip_generic_variables(mock_values):
function test_remove_auto_env (line 65) | def test_remove_auto_env(mock_values):
function test_remove_env_not_defined (line 77) | def test_remove_env_not_defined(mock_values):
function test_add_from_all_sources (line 85) | def test_add_from_all_sources(mock_values):
function test_user_add_vars (line 103) | def test_user_add_vars(mock_values):
function test_user_add_duplicate_vars (line 119) | def test_user_add_duplicate_vars(mock_values):
function test_user_env_without_name (line 132) | def test_user_env_without_name(mock_values):
function test_user_env_try_to_overwrite_auto_vars (line 144) | def test_user_env_try_to_overwrite_auto_vars(mock_values):
function test_user_env_try_to_overwrite_app_dev_vars (line 158) | def test_user_env_try_to_overwrite_app_dev_vars(mock_values):
function test_app_dev_vars_try_to_overwrite_auto_vars (line 172) | def test_app_dev_vars_try_to_overwrite_auto_vars(mock_values):
function test_app_dev_no_name (line 182) | def test_app_dev_no_name(mock_values):
function test_app_dev_duplicate_vars (line 190) | def test_app_dev_duplicate_vars(mock_values):
function test_format_vars (line 199) | def test_format_vars(mock_values):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_expose.py
function mock_values (line 8) | def mock_values():
function test_add_expose_ports (line 19) | def test_add_expose_ports(mock_values):
function test_add_duplicate_expose_ports (line 30) | def test_add_duplicate_expose_ports(mock_values):
function test_add_expose_ports_with_host_network (line 39) | def test_add_expose_ports_with_host_network(mock_values):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_extra_hosts.py
function mock_values (line 8) | def mock_values():
function test_add_extra_host (line 19) | def test_add_extra_host(mock_values):
function test_add_duplicate_extra_host (line 34) | def test_add_duplicate_extra_host(mock_values):
function test_add_extra_host_with_ipv6 (line 43) | def test_add_extra_host_with_ipv6(mock_values):
function test_add_extra_host_with_invalid_ip (line 52) | def test_add_extra_host_with_invalid_ip(mock_values):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_formatter.py
function test_escape_dollar (line 4) | def test_escape_dollar():
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_functions.py
function mock_values (line 9) | def mock_values():
function test_funcs (line 20) | def test_funcs(mock_values):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_healthcheck.py
function mock_values (line 7) | def mock_values():
function test_disable_healthcheck (line 18) | def test_disable_healthcheck(mock_values):
function test_use_built_in_healthcheck (line 26) | def test_use_built_in_healthcheck(mock_values):
function test_set_custom_test (line 34) | def test_set_custom_test(mock_values):
function test_set_custom_test_array (line 49) | def test_set_custom_test_array(mock_values):
function test_CMD_with_var_should_fail (line 64) | def test_CMD_with_var_should_fail(mock_values):
function test_set_options (line 71) | def test_set_options(mock_values):
function test_adding_test_when_disabled (line 91) | def test_adding_test_when_disabled(mock_values):
function test_not_adding_test (line 99) | def test_not_adding_test(mock_values):
function test_invalid_path (line 106) | def test_invalid_path(mock_values):
function test_http_healthcheck (line 113) | def test_http_healthcheck(mock_values):
function test_curl_healthcheck_as_CMD (line 124) | def test_curl_healthcheck_as_CMD(mock_values):
function test_curl_healthcheck (line 145) | def test_curl_healthcheck(mock_values):
function test_curl_healthcheck_with_headers_and_method_and_data (line 166) | def test_curl_healthcheck_with_headers_and_method_and_data(mock_values):
function test_wget_healthcheck (line 191) | def test_wget_healthcheck(mock_values):
function test_wget_healthcheck_no_spider (line 205) | def test_wget_healthcheck_no_spider(mock_values):
function test_wget_healthcheck_data (line 220) | def test_wget_healthcheck_data(mock_values):
function test_wget_healthcheck_data_busybox (line 241) | def test_wget_healthcheck_data_busybox(mock_values):
function test_netcat_healthcheck (line 260) | def test_netcat_healthcheck(mock_values):
function test_netcat_udp_healthcheck (line 276) | def test_netcat_udp_healthcheck(mock_values):
function test_tcp_healthcheck (line 293) | def test_tcp_healthcheck(mock_values):
function test_redis_healthcheck (line 308) | def test_redis_healthcheck(mock_values):
function test_redis_healthcheck_no_password (line 326) | def test_redis_healthcheck_no_password(mock_values):
function test_postgres_healthcheck (line 342) | def test_postgres_healthcheck(mock_values):
function test_mariadb_healthcheck (line 361) | def test_mariadb_healthcheck(mock_values):
function test_mongodb_healthcheck (line 377) | def test_mongodb_healthcheck(mock_values):
function test_pidof (line 396) | def test_pidof(mock_values):
function test_pgrep (line 409) | def test_pgrep(mock_values):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_labels.py
function mock_values (line 7) | def mock_values():
function test_add_disallowed_label (line 18) | def test_add_disallowed_label(mock_values):
function test_add_duplicate_label (line 26) | def test_add_duplicate_label(mock_values):
function test_add_label_on_non_existing_container (line 35) | def test_add_label_on_non_existing_container(mock_values):
function test_add_label (line 50) | def test_add_label(mock_values):
function test_auto_add_labels (line 63) | def test_auto_add_labels(mock_values):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_networks.py
function mock_values (line 7) | def mock_values():
function test_add_internal_network (line 24) | def test_add_internal_network(mock_values):
function test_add_external_network (line 61) | def test_add_external_network(mock_values):
function test_add_both_internal_and_external_network (line 89) | def test_add_both_internal_and_external_network(mock_values):
function test_add_network_with_config (line 123) | def test_add_network_with_config(mock_values):
function test_auto_add_networks (line 172) | def test_auto_add_networks(mock_values):
function test_add_network_with_duplicate_interface_name (line 240) | def test_add_network_with_duplicate_interface_name(mock_values):
function test_add_network_with_duplicate_mac_address (line 250) | def test_add_network_with_duplicate_mac_address(mock_values):
function test_add_network_with_duplicate_ipv4_address (line 260) | def test_add_network_with_duplicate_ipv4_address(mock_values):
function test_add_network_with_duplicate_ipv6_address (line 270) | def test_add_network_with_duplicate_ipv6_address(mock_values):
function test_add_network_with_duplicate_gateway_priority (line 280) | def test_add_network_with_duplicate_gateway_priority(mock_values):
function test_add_network_with_duplicate_priority (line 290) | def test_add_network_with_duplicate_priority(mock_values):
function test_add_duplicate_internal_network (line 300) | def test_add_duplicate_internal_network(mock_values):
function test_add_duplicate_external_network (line 309) | def test_add_duplicate_external_network(mock_values):
function test_add_duplicate_internal_external_network (line 320) | def test_add_duplicate_internal_external_network(mock_values):
function test_add_network_with_duplicate_aliases (line 329) | def test_add_network_with_duplicate_aliases(mock_values):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_notes.py
function mock_values (line 8) | def mock_values():
function test_notes (line 27) | def test_notes(mock_values):
function test_notes_on_non_enterprise_train (line 60) | def test_notes_on_non_enterprise_train(mock_values):
function test_notes_with_warnings (line 95) | def test_notes_with_warnings(mock_values):
function test_notes_with_deprecations (line 137) | def test_notes_with_deprecations(mock_values):
function test_notes_with_body (line 179) | def test_notes_with_body(mock_values):
function test_notes_all (line 225) | def test_notes_all(mock_values):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_portal.py
function mock_values (line 8) | def mock_values():
function test_no_portals (line 19) | def test_no_portals(mock_values):
function test_add_portal_with_host_ips (line 27) | def test_add_portal_with_host_ips(mock_values):
function test_add_duplicate_portal (line 51) | def test_add_duplicate_portal(mock_values):
function test_add_duplicate_portal_with_explicit_name (line 59) | def test_add_duplicate_portal_with_explicit_name(mock_values):
function test_add_portal_with_invalid_scheme (line 67) | def test_add_portal_with_invalid_scheme(mock_values):
function test_add_portal_with_invalid_path (line 74) | def test_add_portal_with_invalid_path(mock_values):
function test_add_portal_with_invalid_path_double_slash (line 81) | def test_add_portal_with_invalid_path_double_slash(mock_values):
function test_add_portal_with_invalid_port (line 88) | def test_add_portal_with_invalid_port(mock_values):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_ports.py
function mock_values (line 8) | def mock_values():
function test_ports (line 355) | def test_ports(test):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_render.py
function mock_values (line 8) | def mock_values():
function test_values_cannot_be_modified (line 19) | def test_values_cannot_be_modified(mock_values):
function test_duplicate_containers (line 26) | def test_duplicate_containers(mock_values):
function test_no_containers (line 34) | def test_no_containers(mock_values):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_resources.py
function mock_values (line 8) | def mock_values():
function test_automatically_add_cpu (line 19) | def test_automatically_add_cpu(mock_values):
function test_invalid_cpu (line 28) | def test_invalid_cpu(mock_values):
function test_automatically_add_memory (line 35) | def test_automatically_add_memory(mock_values):
function test_invalid_memory (line 44) | def test_invalid_memory(mock_values):
function test_automatically_add_gpus (line 51) | def test_automatically_add_gpus(mock_values):
function test_gpu_without_uuid (line 74) | def test_gpu_without_uuid(mock_values):
function test_remove_cpus_and_memory_with_gpus (line 88) | def test_remove_cpus_and_memory_with_gpus(mock_values):
function test_remove_cpus_and_memory (line 105) | def test_remove_cpus_and_memory(mock_values):
function test_remove_devices (line 114) | def test_remove_devices(mock_values):
function test_set_profile (line 125) | def test_set_profile(mock_values):
function test_set_profile_invalid_profile (line 135) | def test_set_profile_invalid_profile(mock_values):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_restart.py
function mock_values (line 7) | def mock_values():
function test_invalid_restart_policy (line 18) | def test_invalid_restart_policy(mock_values):
function test_valid_restart_policy (line 26) | def test_valid_restart_policy(mock_values):
function test_valid_restart_policy_with_maximum_retry_count (line 35) | def test_valid_restart_policy_with_maximum_retry_count(mock_values):
function test_invalid_restart_policy_with_maximum_retry_count (line 44) | def test_invalid_restart_policy_with_maximum_retry_count(mock_values):
function test_invalid_restart_policy_with_maximum_retry_count_and_policy (line 52) | def test_invalid_restart_policy_with_maximum_retry_count_and_policy(mock...
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_security_opts.py
function mock_values (line 8) | def mock_values():
function test_add_security_opt (line 19) | def test_add_security_opt(mock_values):
function test_add_duplicate_security_opt (line 28) | def test_add_duplicate_security_opt(mock_values):
function test_add_empty_security_opt (line 36) | def test_add_empty_security_opt(mock_values):
function test_remove_security_opt (line 44) | def test_remove_security_opt(mock_values):
function test_add_security_opt_boolean (line 53) | def test_add_security_opt_boolean(mock_values):
function test_add_security_opt_arg (line 63) | def test_add_security_opt_arg(mock_values):
function test_add_security_opt_with_invalid_opt (line 75) | def test_add_security_opt_with_invalid_opt(mock_values):
function test_add_security_opt_with_opt_containing_value (line 83) | def test_add_security_opt_with_opt_containing_value(mock_values):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_sysctls.py
function mock_values (line 8) | def mock_values():
function test_add_sysctl (line 19) | def test_add_sysctl(mock_values):
function test_add_net_sysctl_with_host_network (line 29) | def test_add_net_sysctl_with_host_network(mock_values):
function test_add_duplicate_sysctl (line 39) | def test_add_duplicate_sysctl(mock_values):
function test_add_empty_sysctl (line 48) | def test_add_empty_sysctl(mock_values):
function test_add_sysctl_with_invalid_key (line 56) | def test_add_sysctl_with_invalid_key(mock_values):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_truenas_client.py
function mock_render (line 8) | def mock_render():
function test_validate_ip_port_combos_with_new_endpoint (line 156) | def test_validate_ip_port_combos_with_new_endpoint(mock_render, test):
function test_validate_ip_port_combos_with_fallback (line 180) | def test_validate_ip_port_combos_with_fallback(mock_render, test):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_validations.py
function mock_resolve (line 8) | def mock_resolve(self):
function test_is_allowed_path_direct (line 47) | def test_is_allowed_path_direct(test_path, expected):
function test_is_allowed_path_ix_volume (line 53) | def test_is_allowed_path_ix_volume():
function test_is_allowed_path_symlink (line 59) | def test_is_allowed_path_symlink(tmp_path):
function test_is_allowed_path_nested_symlink (line 88) | def test_is_allowed_path_nested_symlink(tmp_path):
function test_is_allowed_path_nonexistent (line 105) | def test_is_allowed_path_nonexistent(tmp_path):
function test_is_allowed_path_restricted_list (line 119) | def test_is_allowed_path_restricted_list(test_path):
function test_is_allowed_path_restricted_in_list (line 128) | def test_is_allowed_path_restricted_in_list(test_path):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_volumes.py
function mock_values (line 9) | def mock_values():
function test_add_volume_invalid_type (line 20) | def test_add_volume_invalid_type(mock_values):
function test_add_volume_empty_mount_path (line 28) | def test_add_volume_empty_mount_path(mock_values):
function test_add_volume_duplicate_mount_path (line 36) | def test_add_volume_duplicate_mount_path(mock_values):
function test_add_volume_host_path_invalid_propagation (line 45) | def test_add_volume_host_path_invalid_propagation(mock_values):
function test_add_host_path_volume_no_host_path_config (line 57) | def test_add_host_path_volume_no_host_path_config(mock_values):
function test_add_host_path_volume_no_path (line 66) | def test_add_host_path_volume_no_path(mock_values):
function test_add_host_path_with_acl_no_path (line 75) | def test_add_host_path_with_acl_no_path(mock_values):
function test_add_host_path_volume_mount (line 84) | def test_add_host_path_volume_mount(mock_values):
function test_add_host_path_volume_mount_with_acl (line 102) | def test_add_host_path_volume_mount_with_acl(mock_values):
function test_add_host_path_volume_mount_with_propagation (line 123) | def test_add_host_path_volume_mount_with_propagation(mock_values):
function test_add_host_path_volume_mount_with_create_host_path (line 141) | def test_add_host_path_volume_mount_with_create_host_path(mock_values):
function test_add_host_path_volume_mount_with_read_only (line 159) | def test_add_host_path_volume_mount_with_read_only(mock_values):
function test_add_ix_volume_invalid_dataset_name (line 177) | def test_add_ix_volume_invalid_dataset_name(mock_values):
function test_add_ix_volume_no_ix_volume_config (line 187) | def test_add_ix_volume_no_ix_volume_config(mock_values):
function test_add_ix_volume_volume_mount (line 197) | def test_add_ix_volume_volume_mount(mock_values):
function test_add_ix_volume_volume_mount_with_options (line 216) | def test_add_ix_volume_volume_mount_with_options(mock_values):
function test_cifs_volume_missing_server (line 238) | def test_cifs_volume_missing_server(mock_values):
function test_cifs_volume_missing_path (line 247) | def test_cifs_volume_missing_path(mock_values):
function test_cifs_volume_missing_username (line 256) | def test_cifs_volume_missing_username(mock_values):
function test_cifs_volume_missing_password (line 265) | def test_cifs_volume_missing_password(mock_values):
function test_cifs_volume_without_cifs_config (line 274) | def test_cifs_volume_without_cifs_config(mock_values):
function test_cifs_volume_duplicate_option (line 283) | def test_cifs_volume_duplicate_option(mock_values):
function test_cifs_volume_disallowed_option (line 301) | def test_cifs_volume_disallowed_option(mock_values):
function test_cifs_volume_invalid_options (line 319) | def test_cifs_volume_invalid_options(mock_values):
function test_cifs_volume_invalid_options2 (line 337) | def test_cifs_volume_invalid_options2(mock_values):
function test_add_cifs_volume (line 355) | def test_add_cifs_volume(mock_values):
function test_cifs_volume_with_options (line 374) | def test_cifs_volume_with_options(mock_values):
function test_nfs_volume_missing_server (line 403) | def test_nfs_volume_missing_server(mock_values):
function test_nfs_volume_missing_path (line 412) | def test_nfs_volume_missing_path(mock_values):
function test_nfs_volume_without_nfs_config (line 421) | def test_nfs_volume_without_nfs_config(mock_values):
function test_nfs_volume_duplicate_option (line 430) | def test_nfs_volume_duplicate_option(mock_values):
function test_nfs_volume_disallowed_option (line 442) | def test_nfs_volume_disallowed_option(mock_values):
function test_nfs_volume_invalid_options (line 451) | def test_nfs_volume_invalid_options(mock_values):
function test_nfs_volume_invalid_options2 (line 460) | def test_nfs_volume_invalid_options2(mock_values):
function test_add_nfs_volume (line 469) | def test_add_nfs_volume(mock_values):
function test_nfs_volume_with_options (line 484) | def test_nfs_volume_with_options(mock_values):
function test_tmpfs_invalid_size (line 507) | def test_tmpfs_invalid_size(mock_values):
function test_tmpfs_zero_size (line 516) | def test_tmpfs_zero_size(mock_values):
function test_tmpfs_invalid_mode (line 525) | def test_tmpfs_invalid_mode(mock_values):
function test_tmpfs_volume (line 534) | def test_tmpfs_volume(mock_values):
function test_add_tmpfs_with_existing_volume (line 551) | def test_add_tmpfs_with_existing_volume(mock_values):
function test_add_volume_with_existing_tmpfs (line 560) | def test_add_volume_with_existing_tmpfs(mock_values):
function test_temporary_volume (line 569) | def test_temporary_volume(mock_values):
function test_docker_volume_missing_config (line 587) | def test_docker_volume_missing_config(mock_values):
function test_docker_volume_missing_volume_name (line 596) | def test_docker_volume_missing_volume_name(mock_values):
function test_docker_volume (line 605) | def test_docker_volume(mock_values):
function test_anonymous_volume (line 624) | def test_anonymous_volume(mock_values):
function test_add_udev (line 637) | def test_add_udev(mock_values):
function test_add_udev_not_read_only (line 654) | def test_add_udev_not_read_only(mock_values):
function test_add_docker_socket (line 671) | def test_add_docker_socket(mock_values):
function test_add_docker_socket_not_read_only (line 688) | def test_add_docker_socket_not_read_only(mock_values):
function test_add_docker_socket_mount_path (line 705) | def test_add_docker_socket_mount_path(mock_values):
function test_host_path_with_disallowed_path (line 722) | def test_host_path_with_disallowed_path(mock_values):
function test_host_path_without_disallowed_path (line 731) | def test_host_path_without_disallowed_path(mock_values):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/tmpfs.py
class Tmpfs (line 16) | class Tmpfs:
method __init__ (line 18) | def __init__(self, render_instance: "Render", container_instance: "Con...
method add (line 23) | def add(self, mount_path: str, config: "IxStorage"):
method is_defined (line 64) | def is_defined(self, mount_path: str):
method has_tmpfs (line 67) | def has_tmpfs(self):
method render (line 70) | def render(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/truenas_client.py
class TrueNASClient (line 27) | class TrueNASClient:
method call (line 28) | def call(self, *args, **kwargs):
class ValidationErrors (line 31) | class ValidationErrors(Exception):
method __init__ (line 32) | def __init__(self, errors):
class PortCombo (line 37) | class PortCombo:
class TNClient (line 42) | class TNClient:
method __init__ (line 43) | def __init__(self, render_instance: "Render"):
method validate_ip_port_combos (line 48) | def validate_ip_port_combos(self, combos: list[PortCombo]) -> None:
method _validation_ip_port_combos (line 62) | def _validation_ip_port_combos(self, combos: list[PortCombo]) -> None:
method _validate_ip_port_combo (line 86) | def _validate_ip_port_combo(self, ip: str, port: int) -> None:
method _format_err (line 100) | def _format_err(self, lines: list[str]) -> str:
method _get_err_lines (line 103) | def _get_err_lines(self, conflicts: list[tuple[str, str, int]]) -> lis...
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/validations.py
function is_truenas_system (line 30) | def is_truenas_system():
function valid_label_key_or_raise (line 35) | def valid_label_key_or_raise(key: str):
function valid_mac_or_raise (line 43) | def valid_mac_or_raise(mac: str):
function valid_security_opt_or_raise (line 49) | def valid_security_opt_or_raise(opt: str):
function valid_port_bind_mode_or_raise (line 59) | def valid_port_bind_mode_or_raise(status: str):
function valid_pull_policy_or_raise (line 66) | def valid_pull_policy_or_raise(pull_policy: str):
function valid_ipc_mode_or_raise (line 73) | def valid_ipc_mode_or_raise(ipc_mode: str, containers: list[str]):
function valid_pid_mode_or_raise (line 84) | def valid_pid_mode_or_raise(ipc_mode: str, containers: list[str]):
function valid_sysctl_or_raise (line 95) | def valid_sysctl_or_raise(sysctl: str, host_network: bool):
function valid_redis_password_or_raise (line 119) | def valid_redis_password_or_raise(password: str):
function valid_octal_mode_or_raise (line 126) | def valid_octal_mode_or_raise(mode: str):
function valid_host_path_propagation (line 133) | def valid_host_path_propagation(propagation: str):
function valid_portal_scheme_or_raise (line 140) | def valid_portal_scheme_or_raise(scheme: str):
function valid_port_or_raise (line 147) | def valid_port_or_raise(port: int):
function valid_ip_or_raise (line 153) | def valid_ip_or_raise(ip: str):
function valid_port_mode_or_raise (line 161) | def valid_port_mode_or_raise(mode: str):
function valid_port_protocol_or_raise (line 168) | def valid_port_protocol_or_raise(protocol: str):
function valid_depend_condition_or_raise (line 175) | def valid_depend_condition_or_raise(condition: str):
function valid_cgroup_perm_or_raise (line 184) | def valid_cgroup_perm_or_raise(cgroup_perm: str):
function valid_cgroup_or_raise (line 193) | def valid_cgroup_or_raise(cgroup: str):
function valid_device_cgroup_rule_or_raise (line 200) | def valid_device_cgroup_rule_or_raise(dev_grp_rule: str):
function allowed_dns_opt_or_raise (line 227) | def allowed_dns_opt_or_raise(dns_opt: str):
function valid_http_path_or_raise (line 234) | def valid_http_path_or_raise(path: str):
function valid_fs_path_or_raise (line 239) | def valid_fs_path_or_raise(path: str):
function is_allowed_path (line 248) | def is_allowed_path(input_path: str, is_ix_volume: bool = False) -> bool:
function allowed_fs_host_path_or_raise (line 264) | def allowed_fs_host_path_or_raise(path: str, is_ix_volume: bool = False):
function _valid_path_or_raise (line 270) | def _valid_path_or_raise(path: str):
function allowed_device_or_raise (line 280) | def allowed_device_or_raise(path: str):
function valid_network_mode_or_raise (line 287) | def valid_network_mode_or_raise(mode: str, containers: list[str]):
function valid_restart_policy_or_raise (line 302) | def valid_restart_policy_or_raise(policy: str, maximum_retry_count: int ...
function valid_cap_or_raise (line 317) | def valid_cap_or_raise(cap: str):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/volume_mount.py
class VolumeMount (line 19) | class VolumeMount:
method __init__ (line 20) | def __init__(self, render_instance: "Render", mount_path: str, config:...
method render (line 86) | def render(self) -> dict:
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/volume_mount_types.py
class BindMountType (line 14) | class BindMountType:
method __init__ (line 15) | def __init__(self, render_instance: "Render", config: "IxStorageBindLi...
method render (line 29) | def render(self) -> dict:
class VolumeMountType (line 34) | class VolumeMountType:
method __init__ (line 35) | def __init__(self, render_instance: "Render", config: "IxStorageVolume...
method render (line 41) | def render(self) -> dict:
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/volume_sources.py
class HostPathSource (line 17) | class HostPathSource:
method __init__ (line 18) | def __init__(self, render_instance: "Render", config: "IxStorageHostPa...
method get (line 37) | def get(self):
class IxVolumeSource (line 41) | class IxVolumeSource:
method __init__ (line 42) | def __init__(self, render_instance: "Render", config: "IxStorageIxVolu...
method get (line 63) | def get(self):
class CifsSource (line 67) | class CifsSource:
method __init__ (line 68) | def __init__(self, render_instance: "Render", config: dict):
method get (line 76) | def get(self):
class NfsSource (line 80) | class NfsSource:
method __init__ (line 81) | def __init__(self, render_instance: "Render", config: dict):
method get (line 89) | def get(self):
class VolumeSource (line 93) | class VolumeSource:
method __init__ (line 94) | def __init__(self, render_instance: "Render", config: "IxStorageVolume...
method get (line 107) | def get(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/volume_types.py
class NfsVolume (line 18) | class NfsVolume:
method __init__ (line 19) | def __init__(self, render_instance: "Render", config: "IxStorageNfsCon...
method get (line 61) | def get(self):
class CifsVolume (line 65) | class CifsVolume:
method __init__ (line 66) | def __init__(self, render_instance: "Render", config: "IxStorageCifsCo...
method get (line 120) | def get(self):
class DockerVolume (line 124) | class DockerVolume:
method __init__ (line 125) | def __init__(self, render_instance: "Render", config: "IxStorageVolume...
method get (line 129) | def get(self):
FILE: ix-dev/community/actual-budget/templates/library/base_v2_3_4/volumes.py
class Volumes (line 17) | class Volumes:
method __init__ (line 18) | def __init__(self, render_instance: "Render"):
method add_volume (line 22) | def add_volume(self, source: str, storage_type: str, config: "IxStorag...
method has_volumes (line 33) | def has_volumes(self) -> bool:
method render (line 36) | def render(self):
class Volume (line 46) | class Volume:
method __init__ (line 47) | def __init__(
method render (line 66) | def render(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/configs.py
class Configs (line 16) | class Configs:
method __init__ (line 17) | def __init__(self, render_instance: "Render"):
method add (line 21) | def add(self, name: str, data: str):
method has_configs (line 37) | def has_configs(self):
method render (line 40) | def render(self):
class ContainerConfigs (line 47) | class ContainerConfigs:
method __init__ (line 48) | def __init__(self, render_instance: "Render", configs: Configs):
method add (line 53) | def add(self, name: str, data: str, target: str, mode: str = ""):
method has_configs (line 66) | def has_configs(self):
method render (line 69) | def render(self):
class ContainerConfig (line 73) | class ContainerConfig:
method __init__ (line 74) | def __init__(self, render_instance: "Render", source: str, target: str...
method render (line 80) | def render(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/container.py
class Container (line 73) | class Container:
method __init__ (line 74) | def __init__(self, render_instance: "Render", name: str, image: str):
method _auto_add_groups (line 124) | def _auto_add_groups(self):
method _auto_set_network_mode (line 127) | def _auto_set_network_mode(self):
method _auto_add_labels (line 131) | def _auto_add_labels(self):
method _auto_add_networks (line 144) | def _auto_add_networks(self):
method _resolve_image (line 158) | def _resolve_image(self, image: str):
method name (line 174) | def name(self) -> str:
method build_image (line 177) | def build_image(self, content: list[str | None]):
method set_pull_policy (line 194) | def set_pull_policy(self, pull_policy: str):
method set_user (line 197) | def set_user(self, user: int, group: int):
method add_extra_host (line 203) | def add_extra_host(self, host: str, ip: str):
method add_group (line 206) | def add_group(self, group: int | str):
method get_additional_groups (line 216) | def get_additional_groups(self) -> list[int | str]:
method get_current_groups (line 223) | def get_current_groups(self) -> list[str]:
method set_tty (line 228) | def set_tty(self, enabled: bool = False):
method set_stdin (line 231) | def set_stdin(self, enabled: bool = False):
method set_ipc_mode (line 234) | def set_ipc_mode(self, ipc_mode: str):
method set_pid_mode (line 237) | def set_pid_mode(self, mode: str = ""):
method add_device_cgroup_rule (line 240) | def add_device_cgroup_rule(self, dev_grp_rule: str):
method set_cgroup (line 243) | def set_cgroup(self, cgroup: str):
method set_mac (line 246) | def set_mac(self, mac_address: str):
method set_init (line 250) | def set_init(self, enabled: bool = False):
method set_read_only (line 253) | def set_read_only(self, enabled: bool = False):
method set_hostname (line 256) | def set_hostname(self, hostname: str):
method set_grace_period (line 259) | def set_grace_period(self, grace_period: int):
method set_privileged (line 264) | def set_privileged(self, enabled: bool = False):
method clear_caps (line 267) | def clear_caps(self):
method add_caps (line 271) | def add_caps(self, caps: list[str]):
method add_security_opt (line 277) | def add_security_opt(self, key: str, value: str | bool | None = None, ...
method remove_security_opt (line 280) | def remove_security_opt(self, key: str):
method set_network_mode (line 283) | def set_network_mode(self, mode: str):
method add_port (line 286) | def add_port(self, port_config: dict | None = None, dev_config: dict |...
method set_entrypoint (line 313) | def set_entrypoint(self, entrypoint: list[str]):
method set_command (line 316) | def set_command(self, command: list[str]):
method add_network (line 319) | def add_network(self, network: str, config: dict = {}):
method add_storage (line 322) | def add_storage(self, mount_path: str, config: "IxStorage"):
method add_docker_socket (line 328) | def add_docker_socket(self, read_only: bool = True, mount_path: str = ...
method add_udev (line 332) | def add_udev(self, read_only: bool = True, mount_path: str = "/run/ude...
method add_tun_device (line 335) | def add_tun_device(self):
method add_snd_device (line 338) | def add_snd_device(self):
method add_usb_bus (line 342) | def add_usb_bus(self):
method setup_as_helper (line 345) | def setup_as_helper(self, profile: str = "low", disable_network: bool ...
method set_shm_size_mb (line 354) | def set_shm_size_mb(self, size: int):
method remove_devices (line 360) | def remove_devices(self):
method storage (line 365) | def storage(self):
method render (line 368) | def render(self) -> dict[str, Any]:
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/depends.py
class Depends (line 14) | class Depends:
method __init__ (line 15) | def __init__(self, render_instance: "Render"):
method add_dependency (line 19) | def add_dependency(self, name: str, condition: str):
method has_dependencies (line 30) | def has_dependencies(self):
method render (line 33) | def render(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/deploy.py
class Deploy (line 12) | class Deploy:
method __init__ (line 13) | def __init__(self, render_instance: "Render"):
method has_deploy (line 17) | def has_deploy(self):
method render (line 20) | def render(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/deps.py
class Deps (line 34) | class Deps:
method __init__ (line 35) | def __init__(self, render_instance: "Render"):
method perms (line 38) | def perms(self, name: str):
method postgres (line 41) | def postgres(self, name: str, image: str, config: PostgresConfig, perm...
method redis (line 44) | def redis(self, name: str, image: str, config: RedisConfig, perms_inst...
method mariadb (line 47) | def mariadb(self, name: str, image: str, config: MariadbConfig, perms_...
method mongodb (line 50) | def mongodb(self, name: str, image: str, config: MongoDBConfig, perms_...
method meilisearch (line 53) | def meilisearch(self, name: str, image: str, config: MeiliConfig, perm...
method elasticsearch (line 56) | def elasticsearch(self, name: str, image: str, config: ElasticConfig, ...
method solr (line 59) | def solr(self, name: str, image: str, config: SolrConfig, perms_instan...
method tika (line 62) | def tika(self, name: str, image: str, config: TikaConfig):
method memcached (line 65) | def memcached(self, name: str, image: str, config: MemcachedConfig):
method guacd (line 68) | def guacd(self, name: str, image: str, config: GuacdConfig):
method cron (line 71) | def cron(self, name: str, image: str, config: CronConfig):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/deps_cron.py
class TasksConfig (line 14) | class TasksConfig(TypedDict):
class CronConfig (line 19) | class CronConfig(TypedDict):
class CronContainer (line 26) | class CronContainer:
method __init__ (line 28) | def __init__(self, render_instance: "Render", name: str, image: str, c...
method container (line 67) | def container(self):
method _get_repo (line 70) | def _get_repo(self, image):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/deps_elastic.py
class ElasticConfig (line 17) | class ElasticConfig(TypedDict):
class ElasticSearchContainer (line 27) | class ElasticSearchContainer:
method __init__ (line 28) | def __init__(
method container (line 76) | def container(self):
method _get_repo (line 79) | def _get_repo(self, image):
method get_port (line 92) | def get_port(self):
method get_url (line 95) | def get_url(self):
method get_snapshots_dir (line 98) | def get_snapshots_dir(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/deps_guacd.py
class GuacdConfig (line 14) | class GuacdConfig(TypedDict):
class GuacdContainer (line 21) | class GuacdContainer:
method __init__ (line 22) | def __init__(self, render_instance: "Render", name: str, image: str, c...
method container (line 49) | def container(self):
method _get_repo (line 52) | def _get_repo(self, image):
method get_port (line 63) | def get_port(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/deps_mariadb.py
class MariadbConfig (line 17) | class MariadbConfig(TypedDict):
class MariadbContainer (line 30) | class MariadbContainer:
method __init__ (line 31) | def __init__(
method _get_repo (line 69) | def _get_repo(self, image):
method get_url (line 80) | def get_url(self, variant: str):
method get_port (line 90) | def get_port(self):
method container (line 94) | def container(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/deps_meilisearch.py
class MeiliConfig (line 17) | class MeiliConfig(TypedDict):
class MeilisearchContainer (line 26) | class MeilisearchContainer:
method __init__ (line 27) | def __init__(
method container (line 69) | def container(self):
method _get_repo (line 72) | def _get_repo(self, image):
method get_port (line 85) | def get_port(self):
method get_url (line 88) | def get_url(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/deps_memcached.py
class MemcachedConfig (line 14) | class MemcachedConfig(TypedDict):
class MemcachedContainer (line 22) | class MemcachedContainer:
method __init__ (line 24) | def __init__(self, render_instance: "Render", name: str, image: str, c...
method container (line 52) | def container(self):
method _get_repo (line 55) | def _get_repo(self, image):
method get_port (line 66) | def get_port(self):
method get_address (line 69) | def get_address(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/deps_mongodb.py
class MongoDBConfig (line 18) | class MongoDBConfig(TypedDict):
class MongoDBContainer (line 28) | class MongoDBContainer:
method __init__ (line 29) | def __init__(
method container (line 70) | def container(self):
method _get_repo (line 73) | def _get_repo(self, image):
method get_port (line 84) | def get_port(self):
method get_url (line 87) | def get_url(self, variant: str):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/deps_perms.py
class PermsContainer (line 18) | class PermsContainer:
method __init__ (line 19) | def __init__(self, render_instance: "Render", name: str):
method add_or_skip_action (line 25) | def add_or_skip_action(self, identifier: str, volume_config: "IxStorag...
method parse_action (line 35) | def parse_action(self, identifier: str, volume_config: "IxStorage", ac...
method normalize_identifier_for_path (line 102) | def normalize_identifier_for_path(self, identifier: str):
method has_actions (line 105) | def has_actions(self):
method activate (line 108) | def activate(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/deps_postgres.py
class PostgresConfig (line 21) | class PostgresConfig(TypedDict):
function get_major_version (line 51) | def get_major_version(variant: str, tag: str):
class PostgresContainer (line 112) | class PostgresContainer:
method __init__ (line 113) | def __init__(
method container (line 193) | def container(self):
method add_dependency (line 196) | def add_dependency(self, container_name: str, condition: str):
method _get_repo (line 201) | def _get_repo(self, image):
method _get_target_version (line 212) | def _get_target_version(self, image):
method get_port (line 231) | def get_port(self):
method get_url (line 234) | def get_url(self, variant: str):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/deps_redis.py
class RedisConfig (line 18) | class RedisConfig(TypedDict):
class RedisContainer (line 27) | class RedisContainer:
method __init__ (line 28) | def __init__(
method _get_repo (line 70) | def _get_repo(self, image):
method get_port (line 81) | def get_port(self):
method get_url (line 84) | def get_url(self, variant: str):
method container (line 97) | def container(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/deps_solr.py
class SolrConfig (line 17) | class SolrConfig(TypedDict):
class SolrContainer (line 27) | class SolrContainer:
method __init__ (line 28) | def __init__(
method container (line 71) | def container(self):
method _get_repo (line 74) | def _get_repo(self, image):
method get_port (line 85) | def get_port(self):
method get_url (line 88) | def get_url(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/deps_tika.py
class TikaConfig (line 14) | class TikaConfig(TypedDict):
class TikaContainer (line 21) | class TikaContainer:
method __init__ (line 22) | def __init__(self, render_instance: "Render", name: str, image: str, c...
method container (line 49) | def container(self):
method _get_repo (line 52) | def _get_repo(self, image):
method get_port (line 63) | def get_port(self):
method get_url (line 66) | def get_url(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/device.py
class Device (line 9) | class Device:
method __init__ (line 10) | def __init__(self, host_device: str, container_device: str, cgroup_per...
method render (line 27) | def render(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/device_cgroup_rules.py
class DeviceCGroupRule (line 14) | class DeviceCGroupRule:
method __init__ (line 15) | def __init__(self, rule: str):
method get_key (line 25) | def get_key(self):
method render (line 28) | def render(self):
class DeviceCGroupRules (line 32) | class DeviceCGroupRules:
method __init__ (line 33) | def __init__(self, render_instance: "Render"):
method add_rule (line 38) | def add_rule(self, rule: str):
method has_rules (line 50) | def has_rules(self):
method render (line 53) | def render(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/devices.py
class Devices (line 14) | class Devices:
method __init__ (line 15) | def __init__(self, render_instance: "Render"):
method _auto_add_devices_from_values (line 25) | def _auto_add_devices_from_values(self):
method add_device (line 33) | def add_device(self, host_device: str, container_device: str, cgroup_p...
method add_usb_bus (line 42) | def add_usb_bus(self):
method _add_snd_device (line 45) | def _add_snd_device(self):
method _add_tun_device (line 48) | def _add_tun_device(self):
method has_devices (line 51) | def has_devices(self):
method remove_devices (line 57) | def remove_devices(self):
method has_gpus (line 64) | def has_gpus(self):
method render (line 70) | def render(self) -> list[str]:
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/dns.py
class Dns (line 14) | class Dns:
method __init__ (line 15) | def __init__(self, render_instance: "Render"):
method _get_dns_opt_keys (line 25) | def _get_dns_opt_keys(self):
method _get_key_from_opt (line 28) | def _get_key_from_opt(self, opt):
method _auto_add_dns_opts_from_values (line 31) | def _auto_add_dns_opts_from_values(self):
method _auto_add_dns_searches_from_values (line 36) | def _auto_add_dns_searches_from_values(self):
method _auto_add_dns_nameservers_from_values (line 41) | def _auto_add_dns_nameservers_from_values(self):
method add_dns_search (line 46) | def add_dns_search(self, dns_search):
method add_dns_nameserver (line 51) | def add_dns_nameserver(self, dns_nameserver):
method add_dns_opt (line 56) | def add_dns_opt(self, dns_opt):
method has_dns_opts (line 63) | def has_dns_opts(self):
method has_dns_searches (line 66) | def has_dns_searches(self):
method has_dns_nameservers (line 69) | def has_dns_nameservers(self):
method render_dns_searches (line 72) | def render_dns_searches(self):
method render_dns_opts (line 75) | def render_dns_opts(self):
method render_dns_nameservers (line 78) | def render_dns_nameservers(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/docker_client.py
class DockerClient (line 15) | class DockerClient:
method __init__ (line 16) | def __init__(self, render_instance: "Render"):
method _auto_fetch_networks (line 29) | def _auto_fetch_networks(self):
method network_exists (line 44) | def network_exists(self, network_name: str) -> bool:
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/environment.py
class Environment (line 15) | class Environment:
method __init__ (line 16) | def __init__(self, render_instance: "Render", resources: Resources):
method _auto_add_variables_from_values (line 31) | def _auto_add_variables_from_values(self):
method _add_generic_variables (line 36) | def _add_generic_variables(self):
method _add_nvidia_variables (line 53) | def _add_nvidia_variables(self):
method _format_value (line 60) | def _format_value(self, v: Any) -> str:
method remove_auto_env (line 69) | def remove_auto_env(self, name: str):
method add_env (line 75) | def add_env(self, name: str, value: Any):
method add_user_envs (line 84) | def add_user_envs(self, user_env: list[dict]):
method has_variables (line 94) | def has_variables(self):
method render (line 97) | def render(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/error.py
class RenderError (line 1) | class RenderError(Exception):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/expose.py
class Expose (line 14) | class Expose:
method __init__ (line 15) | def __init__(self, render_instance: "Render"):
method add_port (line 19) | def add_port(self, port: int, protocol: str = "tcp"):
method has_ports (line 27) | def has_ports(self):
method render (line 30) | def render(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/extra_hosts.py
class ExtraHosts (line 13) | class ExtraHosts:
method __init__ (line 14) | def __init__(self, render_instance: "Render"):
method add_host (line 18) | def add_host(self, host: str, ip: str):
method has_hosts (line 29) | def has_hosts(self):
method render (line 32) | def render(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/formatter.py
function escape_dollar (line 5) | def escape_dollar(text: str) -> str:
function get_hashed_name_for_volume (line 9) | def get_hashed_name_for_volume(prefix: str, config: dict):
function get_hash_with_prefix (line 14) | def get_hash_with_prefix(prefix: str, data: str):
function merge_dicts_no_overwrite (line 18) | def merge_dicts_no_overwrite(dict1, dict2):
function get_image_with_hashed_data (line 25) | def get_image_with_hashed_data(image: str, data: str):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/functions.py
class Functions (line 21) | class Functions:
method __init__ (line 22) | def __init__(self, render_instance: "Render"):
method _to_yaml (line 25) | def _to_yaml(self, data):
method _bcrypt_hash (line 28) | def _bcrypt_hash(self, password: str, rounds: int = 12):
method _htpasswd (line 37) | def _htpasswd(self, username: str, password: str, rounds: int = 12):
method _secure_string (line 41) | def _secure_string(self, length):
method _basic_auth (line 44) | def _basic_auth(self, username, password):
method _basic_auth_header (line 47) | def _basic_auth_header(self, username, password):
method _fail (line 50) | def _fail(self, message):
method _camel_case (line 53) | def _camel_case(self, string):
method _auto_cast (line 56) | def _auto_cast(self, value):
method _match_regex (line 72) | def _match_regex(self, value, regex):
method _must_match_regex (line 77) | def _must_match_regex(self, value, regex):
method _is_boolean (line 82) | def _is_boolean(self, string):
method _is_number (line 85) | def _is_number(self, string):
method _copy_dict (line 92) | def _copy_dict(self, dict):
method _deep_merge (line 95) | def _deep_merge(self, dict1: dict, dict2: dict):
method _disallow_chars (line 113) | def _disallow_chars(self, string: str, chars: list[str], key: str):
method _or_default (line 119) | def _or_default(self, value, default):
method _url_to_dict (line 124) | def _url_to_dict(self, url: str, v6_brackets: bool = False):
method _require_unique (line 157) | def _require_unique(self, values, key, split_char=""):
method _require_no_reserved (line 165) | def _require_no_reserved(self, values, key, reserved, split_char="", s...
method _url_encode (line 181) | def _url_encode(self, string):
method _temp_config (line 184) | def _temp_config(self, name):
method _get_host_path (line 189) | def _get_host_path(self, storage):
method has_amd_gpu (line 210) | def has_amd_gpu(self):
method has_nvidia_gpu (line 216) | def has_nvidia_gpu(self):
method func_map (line 224) | def func_map(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/healthcheck.py
class Healthcheck (line 17) | class Healthcheck:
method __init__ (line 18) | def __init__(self, render_instance: "Render"):
method _get_test (line 29) | def _get_test(self):
method disable (line 34) | def disable(self):
method use_built_in (line 37) | def use_built_in(self):
method set_custom_test (line 40) | def set_custom_test(self, test: str | list[str]):
method set_test (line 48) | def set_test(self, variant: str, config: dict | None = None):
method set_interval (line 52) | def set_interval(self, interval: int):
method set_timeout (line 55) | def set_timeout(self, timeout: int):
method set_retries (line 58) | def set_retries(self, retries: int):
method set_start_period (line 61) | def set_start_period(self, start_period: int):
method set_start_interval (line 64) | def set_start_interval(self, start_interval: int):
method has_healthcheck (line 67) | def has_healthcheck(self):
method render (line 70) | def render(self):
function test_mapping (line 90) | def test_mapping(variant: str, config: dict | None = None) -> list[str]:
function get_key (line 112) | def get_key(config: dict, key: str, default: Any, required: bool):
function curl_test (line 120) | def curl_test(config: dict) -> list[str]:
function wget_test (line 147) | def wget_test(config: dict) -> list[str]:
function http_test (line 189) | def http_test(config: dict) -> list[str]:
function netcat_test (line 199) | def netcat_test(config: dict) -> list[str]:
function tcp_test (line 214) | def tcp_test(config: dict) -> list[str]:
function redis_test (line 222) | def redis_test(config: dict) -> list[str]:
function postgres_test (line 237) | def postgres_test(config: dict) -> list[str]:
function mariadb_test (line 247) | def mariadb_test(config: dict) -> list[str]:
function mongodb_test (line 264) | def mongodb_test(config: dict) -> list[str]:
function pidof_test (line 284) | def pidof_test(config: dict) -> list[str]:
function pgrep_test (line 292) | def pgrep_test(config: dict) -> list[str]:
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/labels.py
class Labels (line 11) | class Labels:
method __init__ (line 12) | def __init__(self):
method add_label (line 15) | def add_label(self, key: str, value: str):
method has_labels (line 23) | def has_labels(self) -> bool:
method render (line 26) | def render(self) -> dict[str, str]:
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/networks.py
class Networks (line 17) | class Networks:
method __init__ (line 18) | def __init__(self, render_instance: "Render"):
method _auto_set_app_name (line 25) | def _auto_set_app_name(self):
method create_internal (line 31) | def create_internal(self, name: str) -> str:
method register (line 52) | def register(self, name: str):
method has_items (line 68) | def has_items(self):
method exists (line 71) | def exists(self, name: str):
method render (line 74) | def render(self):
class NetworkConfig (line 82) | class NetworkConfig:
method __post_init__ (line 94) | def __post_init__(self):
class Network (line 107) | class Network:
method __init__ (line 108) | def __init__(self, name: str, config: dict = {}):
method render (line 112) | def render(self):
class ContainerNetworkConfig (line 131) | class ContainerNetworkConfig:
class ContainerNetworks (line 148) | class ContainerNetworks:
method __init__ (line 149) | def __init__(self, render_instance: "Render"):
method add (line 153) | def add(self, container_name: str, net_name: str, config: dict = {}):
method has_items (line 218) | def has_items(self):
method exists (line 221) | def exists(self, name: str):
method render (line 224) | def render(self):
class ContainerNetwork (line 231) | class ContainerNetwork:
method __init__ (line 232) | def __init__(self, name: str, config: dict = {}):
method render (line 236) | def render(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/notes.py
class Security (line 11) | class Security:
class Notes (line 16) | class Notes:
method __init__ (line 17) | def __init__(self, render_instance: "Render"):
method _is_enterprise_train (line 33) | def _is_enterprise_train(self):
method _auto_set_app_name (line 37) | def _auto_set_app_name(self):
method _auto_set_app_train (line 41) | def _auto_set_app_train(self):
method _auto_set_footer (line 45) | def _auto_set_footer(self):
method _set_header (line 54) | def _set_header(self):
method add_info (line 61) | def add_info(self, info: str):
method add_warning (line 64) | def add_warning(self, warning: str):
method _prepend_warning (line 67) | def _prepend_warning(self, warning: str):
method add_deprecation (line 70) | def add_deprecation(self, deprecation: str):
method has_deprecations (line 73) | def has_deprecations(self) -> bool:
method has_warnings (line 76) | def has_warnings(self) -> bool:
method set_body (line 79) | def set_body(self, body: str):
method get_pretty_host_mount (line 82) | def get_pretty_host_mount(self, hm: str) -> tuple[str, bool]:
method get_group_name_from_id (line 118) | def get_group_name_from_id(self, group_id: int | str) -> str:
method scan_containers (line 131) | def scan_containers(self):
method render (line 246) | def render(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/portals.py
class Portals (line 16) | class Portals:
method __init__ (line 17) | def __init__(self, render_instance: "Render"):
method add (line 21) | def add(self, port: dict, config: dict | None = None):
method render (line 54) | def render(self):
class Portal (line 58) | class Portal:
method __init__ (line 59) | def __init__(self, name: str, config: dict):
method render (line 66) | def render(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/ports.py
class Ports (line 27) | class Ports:
method __init__ (line 28) | def __init__(self, render_instance: "Render"):
method _gen_port_key (line 34) | def _gen_port_key(self, host_port: int, host_ip: str, proto: str, ip_f...
method _is_wildcard_ip (line 37) | def _is_wildcard_ip(self, ip: str) -> bool:
method _get_opposite_wildcard (line 40) | def _get_opposite_wildcard(self, ip: str) -> str:
method _get_sort_key (line 43) | def _get_sort_key(self, p: dict) -> str:
method _is_ports_same (line 46) | def _is_ports_same(self, port1: dict, port2: dict) -> bool:
method _has_opposite_family_port (line 54) | def _has_opposite_family_port(self, port_config: dict, wildcard_ports:...
method _check_port_conflicts_in_this_app (line 62) | def _check_port_conflicts_in_this_app(self, port_config: dict, ip_fami...
method _add_port (line 101) | def _add_port(self, host_port: int, container_port: int, config: dict ...
method has_ports (line 126) | def has_ports(self):
method render (line 129) | def render(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/render.py
class Render (line 29) | class Render(object):
method __init__ (line 30) | def __init__(self, values):
method _auto_add_networks (line 50) | def _auto_add_networks(self):
method container_names (line 58) | def container_names(self):
method add_container (line 61) | def add_container(self, name: str, image: str):
method render (line 71) | def render(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/resources.py
class Resources (line 16) | class Resources:
method __init__ (line 17) | def __init__(self, render_instance: "Render"):
method _set_cpu (line 26) | def _set_cpu(self, cpus: Any):
method _set_memory (line 32) | def _set_memory(self, memory: Any):
method _auto_add_cpu_from_values (line 38) | def _auto_add_cpu_from_values(self):
method _auto_add_memory_from_values (line 42) | def _auto_add_memory_from_values(self):
method _auto_add_gpus_from_values (line 46) | def _auto_add_gpus_from_values(self):
method remove_cpus_and_memory (line 72) | def remove_cpus_and_memory(self):
method remove_devices (line 79) | def remove_devices(self):
method set_profile (line 82) | def set_profile(self, profile: str):
method has_resources (line 87) | def has_resources(self):
method has_gpus (line 90) | def has_gpus(self):
method render (line 94) | def render(self):
function profile_mapping (line 104) | def profile_mapping(profile: str):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/restart.py
class RestartPolicy (line 12) | class RestartPolicy:
method __init__ (line 13) | def __init__(self, render_instance: "Render"):
method set_policy (line 18) | def set_policy(self, policy: str, maximum_retry_count: int = 0):
method render (line 22) | def render(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/security_opts.py
class SecurityOpt (line 14) | class SecurityOpt:
method __init__ (line 15) | def __init__(self, opt: str, value: str | bool | None = None, arg: str...
method render (line 20) | def render(self):
class SecurityOpts (line 29) | class SecurityOpts:
method __init__ (line 30) | def __init__(self, render_instance: "Render"):
method add_opt (line 35) | def add_opt(self, key: str, value: str | bool | None, arg: str | None ...
method remove_opt (line 40) | def remove_opt(self, key: str):
method has_opts (line 45) | def has_opts(self):
method render (line 48) | def render(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/storage.py
class IxStorageTmpfsConfig (line 17) | class IxStorageTmpfsConfig(TypedDict):
class AclConfig (line 24) | class AclConfig(TypedDict, total=False):
class IxStorageHostPathConfig (line 28) | class IxStorageHostPathConfig(TypedDict):
class IxStorageIxVolumeConfig (line 37) | class IxStorageIxVolumeConfig(TypedDict):
class IxStorageVolumeConfig (line 46) | class IxStorageVolumeConfig(TypedDict):
class IxStorageNfsConfig (line 52) | class IxStorageNfsConfig(TypedDict):
class IxStorageCifsConfig (line 58) | class IxStorageCifsConfig(TypedDict):
class IxStorage (line 72) | class IxStorage(TypedDict):
class Storage (line 84) | class Storage:
method __init__ (line 85) | def __init__(self, render_instance: "Render", container_instance: "Con...
method add (line 90) | def add(self, mount_path: str, config: "IxStorage"):
method is_defined (line 100) | def is_defined(self, mount_path: str):
method _add_docker_socket (line 103) | def _add_docker_socket(self, read_only: bool = True, mount_path: str =...
method _add_udev (line 112) | def _add_udev(self, read_only: bool = True, mount_path: str = ""):
method has_mounts (line 121) | def has_mounts(self) -> bool:
method render (line 124) | def render(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/sysctls.py
class Sysctls (line 15) | class Sysctls:
method __init__ (line 16) | def __init__(self, render_instance: "Render", container_instance: "Con...
method add (line 21) | def add(self, key: str, value):
method has_sysctls (line 31) | def has_sysctls(self):
method render (line 34) | def render(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_build_image.py
function mock_values (line 7) | def mock_values():
function test_build_image_with_from (line 18) | def test_build_image_with_from(mock_values):
function test_build_image_with_from_with_whitespace (line 26) | def test_build_image_with_from_with_whitespace(mock_values):
function test_build_image (line 34) | def test_build_image(mock_values):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_configs.py
function mock_values (line 7) | def mock_values():
function test_add_duplicate_config_with_different_data (line 18) | def test_add_duplicate_config_with_different_data(mock_values):
function test_add_config_with_empty_target (line 27) | def test_add_config_with_empty_target(mock_values):
function test_add_config_with_empty_data (line 35) | def test_add_config_with_empty_data(mock_values):
function test_add_duplicate_target (line 43) | def test_add_duplicate_target(mock_values):
function test_add_config (line 52) | def test_add_config(mock_values):
function test_add_config_with_mode (line 62) | def test_add_config_with_mode(mock_values):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_container.py
function mock_values (line 8) | def mock_values():
function test_empty_container_name (line 19) | def test_empty_container_name(mock_values):
function test_resolve_image (line 25) | def test_resolve_image(mock_values):
function test_missing_repo (line 33) | def test_missing_repo(mock_values):
function test_missing_tag (line 40) | def test_missing_tag(mock_values):
function test_non_existing_image (line 47) | def test_non_existing_image(mock_values):
function test_pull_policy (line 53) | def test_pull_policy(mock_values):
function test_invalid_pull_policy (line 62) | def test_invalid_pull_policy(mock_values):
function test_clear_caps (line 69) | def test_clear_caps(mock_values):
function test_privileged (line 80) | def test_privileged(mock_values):
function test_tty (line 89) | def test_tty(mock_values):
function test_init (line 98) | def test_init(mock_values):
function test_read_only (line 107) | def test_read_only(mock_values):
function test_stdin (line 116) | def test_stdin(mock_values):
function test_hostname (line 125) | def test_hostname(mock_values):
function test_grace_period (line 134) | def test_grace_period(mock_values):
function test_user (line 143) | def test_user(mock_values):
function test_invalid_user (line 152) | def test_invalid_user(mock_values):
function test_add_group (line 160) | def test_add_group(mock_values):
function test_add_duplicate_group (line 170) | def test_add_duplicate_group(mock_values):
function test_add_group_as_string (line 179) | def test_add_group_as_string(mock_values):
function test_add_docker_socket (line 187) | def test_add_docker_socket(mock_values):
function test_snd_device (line 208) | def test_snd_device(mock_values):
function test_shm_size (line 218) | def test_shm_size(mock_values):
function test_valid_caps (line 227) | def test_valid_caps(mock_values):
function test_add_duplicate_caps (line 237) | def test_add_duplicate_caps(mock_values):
function test_invalid_caps (line 245) | def test_invalid_caps(mock_values):
function test_network_mode (line 253) | def test_network_mode(mock_values):
function test_auto_network_mode_with_host_network (line 262) | def test_auto_network_mode_with_host_network(mock_values):
function test_network_mode_with_container (line 271) | def test_network_mode_with_container(mock_values):
function test_network_mode_with_container_missing (line 280) | def test_network_mode_with_container_missing(mock_values):
function test_invalid_network_mode (line 288) | def test_invalid_network_mode(mock_values):
function test_entrypoint (line 296) | def test_entrypoint(mock_values):
function test_command (line 305) | def test_command(mock_values):
function test_add_ports (line 314) | def test_add_ports(mock_values):
function test_add_ports_with_invalid_host_ips (line 335) | def test_add_ports_with_invalid_host_ips(mock_values):
function test_add_ports_with_empty_host_ips (line 343) | def test_add_ports_with_empty_host_ips(mock_values):
function test_set_ipc_mode (line 354) | def test_set_ipc_mode(mock_values):
function test_set_ipc_empty_mode (line 363) | def test_set_ipc_empty_mode(mock_values):
function test_set_ipc_mode_with_invalid_ipc_mode (line 372) | def test_set_ipc_mode_with_invalid_ipc_mode(mock_values):
function test_set_ipc_mode_with_container_ipc_mode (line 380) | def test_set_ipc_mode_with_container_ipc_mode(mock_values):
function test_set_ipc_mode_with_container_ipc_mode_and_invalid_container (line 391) | def test_set_ipc_mode_with_container_ipc_mode_and_invalid_container(mock...
function test_set_pid_mode (line 399) | def test_set_pid_mode(mock_values):
function test_set_pid_empty_mode (line 408) | def test_set_pid_empty_mode(mock_values):
function test_set_pid_mode_with_invalid_pid_mode (line 417) | def test_set_pid_mode_with_invalid_pid_mode(mock_values):
function test_set_pid_mode_with_container_pid_mode (line 425) | def test_set_pid_mode_with_container_pid_mode(mock_values):
function test_set_pid_mode_with_container_pid_mode_and_invalid_container (line 436) | def test_set_pid_mode_with_container_pid_mode_and_invalid_container(mock...
function test_set_cgroup (line 444) | def test_set_cgroup(mock_values):
function test_set_cgroup_invalid (line 453) | def test_set_cgroup_invalid(mock_values):
function test_set_mac_invalid (line 461) | def test_set_mac_invalid(mock_values):
function test_set_mac_valid (line 469) | def test_set_mac_valid(mock_values):
function test_setup_as_helper (line 478) | def test_setup_as_helper(mock_values):
function test_setup_as_helper_med_profile (line 492) | def test_setup_as_helper_med_profile(mock_values):
function test_setup_as_helper_no_profile (line 506) | def test_setup_as_helper_no_profile(mock_values):
function test_setup_as_helper_with_net (line 520) | def test_setup_as_helper_with_net(mock_values):
function test_container_name (line 533) | def test_container_name(mock_values):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_depends.py
function mock_values (line 8) | def mock_values():
function test_add_dependency (line 19) | def test_add_dependency(mock_values):
function test_add_dependency_invalid_condition (line 30) | def test_add_dependency_invalid_condition(mock_values):
function test_add_dependency_missing_container (line 39) | def test_add_dependency_missing_container(mock_values):
function test_add_dependency_duplicate (line 47) | def test_add_dependency_duplicate(mock_values):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_deps.py
function mock_values (line 8) | def mock_values():
function test_add_postgres_missing_config (line 27) | def test_add_postgres_missing_config(mock_values):
function test_add_postgres_unsupported_repo (line 39) | def test_add_postgres_unsupported_repo(mock_values):
function test_add_postgres (line 59) | def test_add_postgres(mock_values):
function test_add_postgres_options (line 137) | def test_add_postgres_options(mock_values):
function test_add_redis_missing_config (line 165) | def test_add_redis_missing_config(mock_values):
function test_add_redis_unsupported_repo (line 177) | def test_add_redis_unsupported_repo(mock_values):
function test_add_redis_with_password_with_spaces (line 195) | def test_add_redis_with_password_with_spaces(mock_values):
function test_add_redis (line 208) | def test_add_redis(mock_values):
function test_add_mariadb_missing_config (line 279) | def test_add_mariadb_missing_config(mock_values):
function test_add_mariadb_unsupported_repo (line 291) | def test_add_mariadb_unsupported_repo(mock_values):
function test_add_mariadb (line 311) | def test_add_mariadb(mock_values):
function test_add_perms_container (line 380) | def test_add_perms_container(mock_values):
function test_add_duplicate_perms_action (line 488) | def test_add_duplicate_perms_action(mock_values):
function test_add_perm_action_without_auto_perms_enabled (line 500) | def test_add_perm_action_without_auto_perms_enabled(mock_values):
function test_add_unsupported_postgres_version (line 517) | def test_add_unsupported_postgres_version(mock_values):
function test_add_postgres_with_invalid_tag (line 530) | def test_add_postgres_with_invalid_tag(mock_values):
function test_postgres_with_upgrade_container (line 543) | def test_postgres_with_upgrade_container(mock_values):
function test_postgres_version_with_digest_pin (line 584) | def test_postgres_version_with_digest_pin(mock_values):
function test_add_mongodb (line 609) | def test_add_mongodb(mock_values):
function test_add_mongodb_unsupported_repo (line 679) | def test_add_mongodb_unsupported_repo(mock_values):
function test_add_meilisearch (line 699) | def test_add_meilisearch(mock_values):
function test_add_meilisearch_unsupported_repo (line 768) | def test_add_meilisearch_unsupported_repo(mock_values):
function test_add_elasticsearch (line 786) | def test_add_elasticsearch(mock_values):
function test_add_elasticsearch_unsupported_repo (line 865) | def test_add_elasticsearch_unsupported_repo(mock_values):
function test_add_solr (line 884) | def test_add_solr(mock_values):
function test_add_solr_unsupported_repo (line 953) | def test_add_solr_unsupported_repo(mock_values):
function test_add_tika (line 971) | def test_add_tika(mock_values):
function test_add_tika_unsupported_repo (line 1015) | def test_add_tika_unsupported_repo(mock_values):
function test_add_memcached (line 1028) | def test_add_memcached(mock_values):
function test_add_memcached_unsupported_repo (line 1073) | def test_add_memcached_unsupported_repo(mock_values):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_device.py
function mock_values (line 8) | def mock_values():
function test_add_device (line 19) | def test_add_device(mock_values):
function test_devices_without_host (line 29) | def test_devices_without_host(mock_values):
function test_devices_without_container (line 37) | def test_devices_without_container(mock_values):
function test_add_duplicate_device (line 45) | def test_add_duplicate_device(mock_values):
function test_add_device_with_invalid_container_path (line 54) | def test_add_device_with_invalid_container_path(mock_values):
function test_add_device_with_invalid_host_path (line 62) | def test_add_device_with_invalid_host_path(mock_values):
function test_add_disallowed_device (line 70) | def test_add_disallowed_device(mock_values):
function test_add_device_with_invalid_cgroup_perm (line 78) | def test_add_device_with_invalid_cgroup_perm(mock_values):
function test_automatically_add_gpu_devices (line 86) | def test_automatically_add_gpu_devices(mock_values):
function test_automatically_add_gpu_devices_and_kfd (line 96) | def test_automatically_add_gpu_devices_and_kfd(mock_values):
function test_remove_gpu_devices (line 106) | def test_remove_gpu_devices(mock_values):
function test_add_usb_bus (line 117) | def test_add_usb_bus(mock_values):
function test_add_usb_bus_disallowed (line 126) | def test_add_usb_bus_disallowed(mock_values):
function test_add_snd_device (line 134) | def test_add_snd_device(mock_values):
function test_add_tun_device (line 144) | def test_add_tun_device(mock_values):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_device_cgroup_rules.py
function mock_values (line 8) | def mock_values():
function test_device_cgroup_rule (line 19) | def test_device_cgroup_rule(mock_values):
function test_device_cgroup_rule_duplicate (line 32) | def test_device_cgroup_rule_duplicate(mock_values):
function test_device_cgroup_rule_duplicate_group (line 41) | def test_device_cgroup_rule_duplicate_group(mock_values):
function test_device_cgroup_rule_invalid_device (line 50) | def test_device_cgroup_rule_invalid_device(mock_values):
function test_device_cgroup_rule_invalid_perm (line 58) | def test_device_cgroup_rule_invalid_perm(mock_values):
function test_device_cgroup_rule_invalid_format (line 66) | def test_device_cgroup_rule_invalid_format(mock_values):
function test_device_cgroup_rule_invalid_format_missing_major (line 74) | def test_device_cgroup_rule_invalid_format_missing_major(mock_values):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_dns.py
function mock_values (line 8) | def mock_values():
function test_auto_add_dns_opts (line 19) | def test_auto_add_dns_opts(mock_values):
function test_auto_add_dns_searches (line 28) | def test_auto_add_dns_searches(mock_values):
function test_auto_add_dns_nameservers (line 37) | def test_auto_add_dns_nameservers(mock_values):
function test_add_duplicate_dns_nameservers (line 46) | def test_add_duplicate_dns_nameservers(mock_values):
function test_add_duplicate_dns_searches (line 53) | def test_add_duplicate_dns_searches(mock_values):
function test_add_duplicate_dns_opts (line 60) | def test_add_duplicate_dns_opts(mock_values):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_environment.py
function mock_values (line 8) | def mock_values():
function test_auto_add_vars (line 19) | def test_auto_add_vars(mock_values):
function test_skip_generic_variables (line 50) | def test_skip_generic_variables(mock_values):
function test_remove_auto_env (line 65) | def test_remove_auto_env(mock_values):
function test_remove_env_not_defined (line 77) | def test_remove_env_not_defined(mock_values):
function test_add_from_all_sources (line 85) | def test_add_from_all_sources(mock_values):
function test_user_add_vars (line 103) | def test_user_add_vars(mock_values):
function test_user_add_duplicate_vars (line 119) | def test_user_add_duplicate_vars(mock_values):
function test_user_env_without_name (line 132) | def test_user_env_without_name(mock_values):
function test_user_env_try_to_overwrite_auto_vars (line 144) | def test_user_env_try_to_overwrite_auto_vars(mock_values):
function test_user_env_try_to_overwrite_app_dev_vars (line 158) | def test_user_env_try_to_overwrite_app_dev_vars(mock_values):
function test_app_dev_vars_try_to_overwrite_auto_vars (line 172) | def test_app_dev_vars_try_to_overwrite_auto_vars(mock_values):
function test_app_dev_no_name (line 182) | def test_app_dev_no_name(mock_values):
function test_app_dev_duplicate_vars (line 190) | def test_app_dev_duplicate_vars(mock_values):
function test_format_vars (line 199) | def test_format_vars(mock_values):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_expose.py
function mock_values (line 8) | def mock_values():
function test_add_expose_ports (line 19) | def test_add_expose_ports(mock_values):
function test_add_duplicate_expose_ports (line 30) | def test_add_duplicate_expose_ports(mock_values):
function test_add_expose_ports_with_host_network (line 39) | def test_add_expose_ports_with_host_network(mock_values):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_extra_hosts.py
function mock_values (line 8) | def mock_values():
function test_add_extra_host (line 19) | def test_add_extra_host(mock_values):
function test_add_duplicate_extra_host (line 34) | def test_add_duplicate_extra_host(mock_values):
function test_add_extra_host_with_ipv6 (line 43) | def test_add_extra_host_with_ipv6(mock_values):
function test_add_extra_host_with_invalid_ip (line 52) | def test_add_extra_host_with_invalid_ip(mock_values):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_formatter.py
function test_escape_dollar (line 4) | def test_escape_dollar():
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_functions.py
function mock_values (line 9) | def mock_values():
function test_funcs (line 20) | def test_funcs(mock_values):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_healthcheck.py
function mock_values (line 7) | def mock_values():
function test_disable_healthcheck (line 18) | def test_disable_healthcheck(mock_values):
function test_use_built_in_healthcheck (line 26) | def test_use_built_in_healthcheck(mock_values):
function test_set_custom_test (line 34) | def test_set_custom_test(mock_values):
function test_set_custom_test_array (line 49) | def test_set_custom_test_array(mock_values):
function test_CMD_with_var_should_fail (line 64) | def test_CMD_with_var_should_fail(mock_values):
function test_set_options (line 71) | def test_set_options(mock_values):
function test_adding_test_when_disabled (line 91) | def test_adding_test_when_disabled(mock_values):
function test_not_adding_test (line 99) | def test_not_adding_test(mock_values):
function test_invalid_path (line 106) | def test_invalid_path(mock_values):
function test_http_healthcheck (line 113) | def test_http_healthcheck(mock_values):
function test_curl_healthcheck_as_CMD (line 124) | def test_curl_healthcheck_as_CMD(mock_values):
function test_curl_healthcheck (line 145) | def test_curl_healthcheck(mock_values):
function test_curl_healthcheck_with_headers_and_method_and_data (line 166) | def test_curl_healthcheck_with_headers_and_method_and_data(mock_values):
function test_wget_healthcheck (line 191) | def test_wget_healthcheck(mock_values):
function test_wget_healthcheck_no_spider (line 205) | def test_wget_healthcheck_no_spider(mock_values):
function test_wget_healthcheck_data (line 220) | def test_wget_healthcheck_data(mock_values):
function test_wget_healthcheck_data_busybox (line 241) | def test_wget_healthcheck_data_busybox(mock_values):
function test_netcat_healthcheck (line 260) | def test_netcat_healthcheck(mock_values):
function test_netcat_udp_healthcheck (line 276) | def test_netcat_udp_healthcheck(mock_values):
function test_tcp_healthcheck (line 293) | def test_tcp_healthcheck(mock_values):
function test_redis_healthcheck (line 308) | def test_redis_healthcheck(mock_values):
function test_redis_healthcheck_no_password (line 326) | def test_redis_healthcheck_no_password(mock_values):
function test_postgres_healthcheck (line 342) | def test_postgres_healthcheck(mock_values):
function test_mariadb_healthcheck (line 361) | def test_mariadb_healthcheck(mock_values):
function test_mongodb_healthcheck (line 377) | def test_mongodb_healthcheck(mock_values):
function test_pidof (line 396) | def test_pidof(mock_values):
function test_pgrep (line 409) | def test_pgrep(mock_values):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_labels.py
function mock_values (line 7) | def mock_values():
function test_add_disallowed_label (line 18) | def test_add_disallowed_label(mock_values):
function test_add_duplicate_label (line 26) | def test_add_duplicate_label(mock_values):
function test_add_label_on_non_existing_container (line 35) | def test_add_label_on_non_existing_container(mock_values):
function test_add_label (line 50) | def test_add_label(mock_values):
function test_auto_add_labels (line 63) | def test_auto_add_labels(mock_values):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_networks.py
function mock_values (line 7) | def mock_values():
function test_add_internal_network (line 24) | def test_add_internal_network(mock_values):
function test_add_external_network (line 61) | def test_add_external_network(mock_values):
function test_add_both_internal_and_external_network (line 89) | def test_add_both_internal_and_external_network(mock_values):
function test_add_network_with_config (line 123) | def test_add_network_with_config(mock_values):
function test_auto_add_networks (line 172) | def test_auto_add_networks(mock_values):
function test_add_network_with_duplicate_interface_name (line 240) | def test_add_network_with_duplicate_interface_name(mock_values):
function test_add_network_with_duplicate_mac_address (line 250) | def test_add_network_with_duplicate_mac_address(mock_values):
function test_add_network_with_duplicate_ipv4_address (line 260) | def test_add_network_with_duplicate_ipv4_address(mock_values):
function test_add_network_with_duplicate_ipv6_address (line 270) | def test_add_network_with_duplicate_ipv6_address(mock_values):
function test_add_network_with_duplicate_gateway_priority (line 280) | def test_add_network_with_duplicate_gateway_priority(mock_values):
function test_add_network_with_duplicate_priority (line 290) | def test_add_network_with_duplicate_priority(mock_values):
function test_add_duplicate_internal_network (line 300) | def test_add_duplicate_internal_network(mock_values):
function test_add_duplicate_external_network (line 309) | def test_add_duplicate_external_network(mock_values):
function test_add_duplicate_internal_external_network (line 320) | def test_add_duplicate_internal_external_network(mock_values):
function test_add_network_with_duplicate_aliases (line 329) | def test_add_network_with_duplicate_aliases(mock_values):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_notes.py
function mock_values (line 8) | def mock_values():
function test_notes (line 27) | def test_notes(mock_values):
function test_notes_on_non_enterprise_train (line 60) | def test_notes_on_non_enterprise_train(mock_values):
function test_notes_with_warnings (line 95) | def test_notes_with_warnings(mock_values):
function test_notes_with_deprecations (line 137) | def test_notes_with_deprecations(mock_values):
function test_notes_with_body (line 179) | def test_notes_with_body(mock_values):
function test_notes_all (line 225) | def test_notes_all(mock_values):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_portal.py
function mock_values (line 8) | def mock_values():
function test_no_portals (line 19) | def test_no_portals(mock_values):
function test_add_portal_with_host_ips (line 27) | def test_add_portal_with_host_ips(mock_values):
function test_add_duplicate_portal (line 51) | def test_add_duplicate_portal(mock_values):
function test_add_duplicate_portal_with_explicit_name (line 59) | def test_add_duplicate_portal_with_explicit_name(mock_values):
function test_add_portal_with_invalid_scheme (line 67) | def test_add_portal_with_invalid_scheme(mock_values):
function test_add_portal_with_invalid_path (line 74) | def test_add_portal_with_invalid_path(mock_values):
function test_add_portal_with_invalid_path_double_slash (line 81) | def test_add_portal_with_invalid_path_double_slash(mock_values):
function test_add_portal_with_invalid_port (line 88) | def test_add_portal_with_invalid_port(mock_values):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_ports.py
function mock_values (line 8) | def mock_values():
function test_ports (line 355) | def test_ports(test):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_render.py
function mock_values (line 8) | def mock_values():
function test_values_cannot_be_modified (line 19) | def test_values_cannot_be_modified(mock_values):
function test_duplicate_containers (line 26) | def test_duplicate_containers(mock_values):
function test_no_containers (line 34) | def test_no_containers(mock_values):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_resources.py
function mock_values (line 8) | def mock_values():
function test_automatically_add_cpu (line 19) | def test_automatically_add_cpu(mock_values):
function test_invalid_cpu (line 28) | def test_invalid_cpu(mock_values):
function test_automatically_add_memory (line 35) | def test_automatically_add_memory(mock_values):
function test_invalid_memory (line 44) | def test_invalid_memory(mock_values):
function test_automatically_add_gpus (line 51) | def test_automatically_add_gpus(mock_values):
function test_gpu_without_uuid (line 74) | def test_gpu_without_uuid(mock_values):
function test_remove_cpus_and_memory_with_gpus (line 88) | def test_remove_cpus_and_memory_with_gpus(mock_values):
function test_remove_cpus_and_memory (line 105) | def test_remove_cpus_and_memory(mock_values):
function test_remove_devices (line 114) | def test_remove_devices(mock_values):
function test_set_profile (line 125) | def test_set_profile(mock_values):
function test_set_profile_invalid_profile (line 135) | def test_set_profile_invalid_profile(mock_values):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_restart.py
function mock_values (line 7) | def mock_values():
function test_invalid_restart_policy (line 18) | def test_invalid_restart_policy(mock_values):
function test_valid_restart_policy (line 26) | def test_valid_restart_policy(mock_values):
function test_valid_restart_policy_with_maximum_retry_count (line 35) | def test_valid_restart_policy_with_maximum_retry_count(mock_values):
function test_invalid_restart_policy_with_maximum_retry_count (line 44) | def test_invalid_restart_policy_with_maximum_retry_count(mock_values):
function test_invalid_restart_policy_with_maximum_retry_count_and_policy (line 52) | def test_invalid_restart_policy_with_maximum_retry_count_and_policy(mock...
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_security_opts.py
function mock_values (line 8) | def mock_values():
function test_add_security_opt (line 19) | def test_add_security_opt(mock_values):
function test_add_duplicate_security_opt (line 28) | def test_add_duplicate_security_opt(mock_values):
function test_add_empty_security_opt (line 36) | def test_add_empty_security_opt(mock_values):
function test_remove_security_opt (line 44) | def test_remove_security_opt(mock_values):
function test_add_security_opt_boolean (line 53) | def test_add_security_opt_boolean(mock_values):
function test_add_security_opt_arg (line 63) | def test_add_security_opt_arg(mock_values):
function test_add_security_opt_with_invalid_opt (line 75) | def test_add_security_opt_with_invalid_opt(mock_values):
function test_add_security_opt_with_opt_containing_value (line 83) | def test_add_security_opt_with_opt_containing_value(mock_values):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_sysctls.py
function mock_values (line 8) | def mock_values():
function test_add_sysctl (line 19) | def test_add_sysctl(mock_values):
function test_add_net_sysctl_with_host_network (line 29) | def test_add_net_sysctl_with_host_network(mock_values):
function test_add_duplicate_sysctl (line 39) | def test_add_duplicate_sysctl(mock_values):
function test_add_empty_sysctl (line 48) | def test_add_empty_sysctl(mock_values):
function test_add_sysctl_with_invalid_key (line 56) | def test_add_sysctl_with_invalid_key(mock_values):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_truenas_client.py
function mock_render (line 8) | def mock_render():
function test_validate_ip_port_combos_with_new_endpoint (line 156) | def test_validate_ip_port_combos_with_new_endpoint(mock_render, test):
function test_validate_ip_port_combos_with_fallback (line 180) | def test_validate_ip_port_combos_with_fallback(mock_render, test):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_validations.py
function mock_resolve (line 8) | def mock_resolve(self):
function test_is_allowed_path_direct (line 47) | def test_is_allowed_path_direct(test_path, expected):
function test_is_allowed_path_ix_volume (line 53) | def test_is_allowed_path_ix_volume():
function test_is_allowed_path_symlink (line 59) | def test_is_allowed_path_symlink(tmp_path):
function test_is_allowed_path_nested_symlink (line 88) | def test_is_allowed_path_nested_symlink(tmp_path):
function test_is_allowed_path_nonexistent (line 105) | def test_is_allowed_path_nonexistent(tmp_path):
function test_is_allowed_path_restricted_list (line 119) | def test_is_allowed_path_restricted_list(test_path):
function test_is_allowed_path_restricted_in_list (line 128) | def test_is_allowed_path_restricted_in_list(test_path):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_volumes.py
function mock_values (line 9) | def mock_values():
function test_add_volume_invalid_type (line 20) | def test_add_volume_invalid_type(mock_values):
function test_add_volume_empty_mount_path (line 28) | def test_add_volume_empty_mount_path(mock_values):
function test_add_volume_duplicate_mount_path (line 36) | def test_add_volume_duplicate_mount_path(mock_values):
function test_add_volume_host_path_invalid_propagation (line 45) | def test_add_volume_host_path_invalid_propagation(mock_values):
function test_add_host_path_volume_no_host_path_config (line 57) | def test_add_host_path_volume_no_host_path_config(mock_values):
function test_add_host_path_volume_no_path (line 66) | def test_add_host_path_volume_no_path(mock_values):
function test_add_host_path_with_acl_no_path (line 75) | def test_add_host_path_with_acl_no_path(mock_values):
function test_add_host_path_volume_mount (line 84) | def test_add_host_path_volume_mount(mock_values):
function test_add_host_path_volume_mount_with_acl (line 102) | def test_add_host_path_volume_mount_with_acl(mock_values):
function test_add_host_path_volume_mount_with_propagation (line 123) | def test_add_host_path_volume_mount_with_propagation(mock_values):
function test_add_host_path_volume_mount_with_create_host_path (line 141) | def test_add_host_path_volume_mount_with_create_host_path(mock_values):
function test_add_host_path_volume_mount_with_read_only (line 159) | def test_add_host_path_volume_mount_with_read_only(mock_values):
function test_add_ix_volume_invalid_dataset_name (line 177) | def test_add_ix_volume_invalid_dataset_name(mock_values):
function test_add_ix_volume_no_ix_volume_config (line 187) | def test_add_ix_volume_no_ix_volume_config(mock_values):
function test_add_ix_volume_volume_mount (line 197) | def test_add_ix_volume_volume_mount(mock_values):
function test_add_ix_volume_volume_mount_with_options (line 216) | def test_add_ix_volume_volume_mount_with_options(mock_values):
function test_cifs_volume_missing_server (line 238) | def test_cifs_volume_missing_server(mock_values):
function test_cifs_volume_missing_path (line 247) | def test_cifs_volume_missing_path(mock_values):
function test_cifs_volume_missing_username (line 256) | def test_cifs_volume_missing_username(mock_values):
function test_cifs_volume_missing_password (line 265) | def test_cifs_volume_missing_password(mock_values):
function test_cifs_volume_without_cifs_config (line 274) | def test_cifs_volume_without_cifs_config(mock_values):
function test_cifs_volume_duplicate_option (line 283) | def test_cifs_volume_duplicate_option(mock_values):
function test_cifs_volume_disallowed_option (line 301) | def test_cifs_volume_disallowed_option(mock_values):
function test_cifs_volume_invalid_options (line 319) | def test_cifs_volume_invalid_options(mock_values):
function test_cifs_volume_invalid_options2 (line 337) | def test_cifs_volume_invalid_options2(mock_values):
function test_add_cifs_volume (line 355) | def test_add_cifs_volume(mock_values):
function test_cifs_volume_with_options (line 374) | def test_cifs_volume_with_options(mock_values):
function test_nfs_volume_missing_server (line 403) | def test_nfs_volume_missing_server(mock_values):
function test_nfs_volume_missing_path (line 412) | def test_nfs_volume_missing_path(mock_values):
function test_nfs_volume_without_nfs_config (line 421) | def test_nfs_volume_without_nfs_config(mock_values):
function test_nfs_volume_duplicate_option (line 430) | def test_nfs_volume_duplicate_option(mock_values):
function test_nfs_volume_disallowed_option (line 442) | def test_nfs_volume_disallowed_option(mock_values):
function test_nfs_volume_invalid_options (line 451) | def test_nfs_volume_invalid_options(mock_values):
function test_nfs_volume_invalid_options2 (line 460) | def test_nfs_volume_invalid_options2(mock_values):
function test_add_nfs_volume (line 469) | def test_add_nfs_volume(mock_values):
function test_nfs_volume_with_options (line 484) | def test_nfs_volume_with_options(mock_values):
function test_tmpfs_invalid_size (line 507) | def test_tmpfs_invalid_size(mock_values):
function test_tmpfs_zero_size (line 516) | def test_tmpfs_zero_size(mock_values):
function test_tmpfs_invalid_mode (line 525) | def test_tmpfs_invalid_mode(mock_values):
function test_tmpfs_volume (line 534) | def test_tmpfs_volume(mock_values):
function test_add_tmpfs_with_existing_volume (line 551) | def test_add_tmpfs_with_existing_volume(mock_values):
function test_add_volume_with_existing_tmpfs (line 560) | def test_add_volume_with_existing_tmpfs(mock_values):
function test_temporary_volume (line 569) | def test_temporary_volume(mock_values):
function test_docker_volume_missing_config (line 587) | def test_docker_volume_missing_config(mock_values):
function test_docker_volume_missing_volume_name (line 596) | def test_docker_volume_missing_volume_name(mock_values):
function test_docker_volume (line 605) | def test_docker_volume(mock_values):
function test_anonymous_volume (line 624) | def test_anonymous_volume(mock_values):
function test_add_udev (line 637) | def test_add_udev(mock_values):
function test_add_udev_not_read_only (line 654) | def test_add_udev_not_read_only(mock_values):
function test_add_docker_socket (line 671) | def test_add_docker_socket(mock_values):
function test_add_docker_socket_not_read_only (line 688) | def test_add_docker_socket_not_read_only(mock_values):
function test_add_docker_socket_mount_path (line 705) | def test_add_docker_socket_mount_path(mock_values):
function test_host_path_with_disallowed_path (line 722) | def test_host_path_with_disallowed_path(mock_values):
function test_host_path_without_disallowed_path (line 731) | def test_host_path_without_disallowed_path(mock_values):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/tmpfs.py
class Tmpfs (line 16) | class Tmpfs:
method __init__ (line 18) | def __init__(self, render_instance: "Render", container_instance: "Con...
method add (line 23) | def add(self, mount_path: str, config: "IxStorage"):
method is_defined (line 64) | def is_defined(self, mount_path: str):
method has_tmpfs (line 67) | def has_tmpfs(self):
method render (line 70) | def render(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/truenas_client.py
class TrueNASClient (line 27) | class TrueNASClient:
method call (line 28) | def call(self, *args, **kwargs):
class ValidationErrors (line 31) | class ValidationErrors(Exception):
method __init__ (line 32) | def __init__(self, errors):
class PortCombo (line 37) | class PortCombo:
class TNClient (line 42) | class TNClient:
method __init__ (line 43) | def __init__(self, render_instance: "Render"):
method validate_ip_port_combos (line 48) | def validate_ip_port_combos(self, combos: list[PortCombo]) -> None:
method _validation_ip_port_combos (line 62) | def _validation_ip_port_combos(self, combos: list[PortCombo]) -> None:
method _validate_ip_port_combo (line 86) | def _validate_ip_port_combo(self, ip: str, port: int) -> None:
method _format_err (line 100) | def _format_err(self, lines: list[str]) -> str:
method _get_err_lines (line 103) | def _get_err_lines(self, conflicts: list[tuple[str, str, int]]) -> lis...
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/validations.py
function is_truenas_system (line 30) | def is_truenas_system():
function valid_label_key_or_raise (line 35) | def valid_label_key_or_raise(key: str):
function valid_mac_or_raise (line 43) | def valid_mac_or_raise(mac: str):
function valid_security_opt_or_raise (line 49) | def valid_security_opt_or_raise(opt: str):
function valid_port_bind_mode_or_raise (line 59) | def valid_port_bind_mode_or_raise(status: str):
function valid_pull_policy_or_raise (line 66) | def valid_pull_policy_or_raise(pull_policy: str):
function valid_ipc_mode_or_raise (line 73) | def valid_ipc_mode_or_raise(ipc_mode: str, containers: list[str]):
function valid_pid_mode_or_raise (line 84) | def valid_pid_mode_or_raise(ipc_mode: str, containers: list[str]):
function valid_sysctl_or_raise (line 95) | def valid_sysctl_or_raise(sysctl: str, host_network: bool):
function valid_redis_password_or_raise (line 119) | def valid_redis_password_or_raise(password: str):
function valid_octal_mode_or_raise (line 126) | def valid_octal_mode_or_raise(mode: str):
function valid_host_path_propagation (line 133) | def valid_host_path_propagation(propagation: str):
function valid_portal_scheme_or_raise (line 140) | def valid_portal_scheme_or_raise(scheme: str):
function valid_port_or_raise (line 147) | def valid_port_or_raise(port: int):
function valid_ip_or_raise (line 153) | def valid_ip_or_raise(ip: str):
function valid_port_mode_or_raise (line 161) | def valid_port_mode_or_raise(mode: str):
function valid_port_protocol_or_raise (line 168) | def valid_port_protocol_or_raise(protocol: str):
function valid_depend_condition_or_raise (line 175) | def valid_depend_condition_or_raise(condition: str):
function valid_cgroup_perm_or_raise (line 184) | def valid_cgroup_perm_or_raise(cgroup_perm: str):
function valid_cgroup_or_raise (line 193) | def valid_cgroup_or_raise(cgroup: str):
function valid_device_cgroup_rule_or_raise (line 200) | def valid_device_cgroup_rule_or_raise(dev_grp_rule: str):
function allowed_dns_opt_or_raise (line 227) | def allowed_dns_opt_or_raise(dns_opt: str):
function valid_http_path_or_raise (line 234) | def valid_http_path_or_raise(path: str):
function valid_fs_path_or_raise (line 239) | def valid_fs_path_or_raise(path: str):
function is_allowed_path (line 248) | def is_allowed_path(input_path: str, is_ix_volume: bool = False) -> bool:
function allowed_fs_host_path_or_raise (line 264) | def allowed_fs_host_path_or_raise(path: str, is_ix_volume: bool = False):
function _valid_path_or_raise (line 270) | def _valid_path_or_raise(path: str):
function allowed_device_or_raise (line 280) | def allowed_device_or_raise(path: str):
function valid_network_mode_or_raise (line 287) | def valid_network_mode_or_raise(mode: str, containers: list[str]):
function valid_restart_policy_or_raise (line 302) | def valid_restart_policy_or_raise(policy: str, maximum_retry_count: int ...
function valid_cap_or_raise (line 317) | def valid_cap_or_raise(cap: str):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/volume_mount.py
class VolumeMount (line 19) | class VolumeMount:
method __init__ (line 20) | def __init__(self, render_instance: "Render", mount_path: str, config:...
method render (line 86) | def render(self) -> dict:
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/volume_mount_types.py
class BindMountType (line 14) | class BindMountType:
method __init__ (line 15) | def __init__(self, render_instance: "Render", config: "IxStorageBindLi...
method render (line 29) | def render(self) -> dict:
class VolumeMountType (line 34) | class VolumeMountType:
method __init__ (line 35) | def __init__(self, render_instance: "Render", config: "IxStorageVolume...
method render (line 41) | def render(self) -> dict:
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/volume_sources.py
class HostPathSource (line 17) | class HostPathSource:
method __init__ (line 18) | def __init__(self, render_instance: "Render", config: "IxStorageHostPa...
method get (line 37) | def get(self):
class IxVolumeSource (line 41) | class IxVolumeSource:
method __init__ (line 42) | def __init__(self, render_instance: "Render", config: "IxStorageIxVolu...
method get (line 63) | def get(self):
class CifsSource (line 67) | class CifsSource:
method __init__ (line 68) | def __init__(self, render_instance: "Render", config: dict):
method get (line 76) | def get(self):
class NfsSource (line 80) | class NfsSource:
method __init__ (line 81) | def __init__(self, render_instance: "Render", config: dict):
method get (line 89) | def get(self):
class VolumeSource (line 93) | class VolumeSource:
method __init__ (line 94) | def __init__(self, render_instance: "Render", config: "IxStorageVolume...
method get (line 107) | def get(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/volume_types.py
class NfsVolume (line 18) | class NfsVolume:
method __init__ (line 19) | def __init__(self, render_instance: "Render", config: "IxStorageNfsCon...
method get (line 61) | def get(self):
class CifsVolume (line 65) | class CifsVolume:
method __init__ (line 66) | def __init__(self, render_instance: "Render", config: "IxStorageCifsCo...
method get (line 120) | def get(self):
class DockerVolume (line 124) | class DockerVolume:
method __init__ (line 125) | def __init__(self, render_instance: "Render", config: "IxStorageVolume...
method get (line 129) | def get(self):
FILE: ix-dev/community/adguard-home/templates/library/base_v2_3_4/volumes.py
class Volumes (line 17) | class Volumes:
method __init__ (line 18) | def __init__(self, render_instance: "Render"):
method add_volume (line 22) | def add_volume(self, source: str, storage_type: str, config: "IxStorag...
method has_volumes (line 33) | def has_volumes(self) -> bool:
method render (line 36) | def render(self):
class Volume (line 46) | class Volume:
method __init__ (line 47) | def __init__(
method render (line 66) | def render(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/configs.py
class Configs (line 16) | class Configs:
method __init__ (line 17) | def __init__(self, render_instance: "Render"):
method add (line 21) | def add(self, name: str, data: str):
method has_configs (line 37) | def has_configs(self):
method render (line 40) | def render(self):
class ContainerConfigs (line 47) | class ContainerConfigs:
method __init__ (line 48) | def __init__(self, render_instance: "Render", configs: Configs):
method add (line 53) | def add(self, name: str, data: str, target: str, mode: str = ""):
method has_configs (line 66) | def has_configs(self):
method render (line 69) | def render(self):
class ContainerConfig (line 73) | class ContainerConfig:
method __init__ (line 74) | def __init__(self, render_instance: "Render", source: str, target: str...
method render (line 80) | def render(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/container.py
class Container (line 73) | class Container:
method __init__ (line 74) | def __init__(self, render_instance: "Render", name: str, image: str):
method _auto_add_groups (line 124) | def _auto_add_groups(self):
method _auto_set_network_mode (line 127) | def _auto_set_network_mode(self):
method _auto_add_labels (line 131) | def _auto_add_labels(self):
method _auto_add_networks (line 144) | def _auto_add_networks(self):
method _resolve_image (line 158) | def _resolve_image(self, image: str):
method name (line 174) | def name(self) -> str:
method build_image (line 177) | def build_image(self, content: list[str | None]):
method set_pull_policy (line 194) | def set_pull_policy(self, pull_policy: str):
method set_user (line 197) | def set_user(self, user: int, group: int):
method add_extra_host (line 203) | def add_extra_host(self, host: str, ip: str):
method add_group (line 206) | def add_group(self, group: int | str):
method get_additional_groups (line 216) | def get_additional_groups(self) -> list[int | str]:
method get_current_groups (line 223) | def get_current_groups(self) -> list[str]:
method set_tty (line 228) | def set_tty(self, enabled: bool = False):
method set_stdin (line 231) | def set_stdin(self, enabled: bool = False):
method set_ipc_mode (line 234) | def set_ipc_mode(self, ipc_mode: str):
method set_pid_mode (line 237) | def set_pid_mode(self, mode: str = ""):
method add_device_cgroup_rule (line 240) | def add_device_cgroup_rule(self, dev_grp_rule: str):
method set_cgroup (line 243) | def set_cgroup(self, cgroup: str):
method set_mac (line 246) | def set_mac(self, mac_address: str):
method set_init (line 250) | def set_init(self, enabled: bool = False):
method set_read_only (line 253) | def set_read_only(self, enabled: bool = False):
method set_hostname (line 256) | def set_hostname(self, hostname: str):
method set_grace_period (line 259) | def set_grace_period(self, grace_period: int):
method set_privileged (line 264) | def set_privileged(self, enabled: bool = False):
method clear_caps (line 267) | def clear_caps(self):
method add_caps (line 271) | def add_caps(self, caps: list[str]):
method add_security_opt (line 277) | def add_security_opt(self, key: str, value: str | bool | None = None, ...
method remove_security_opt (line 280) | def remove_security_opt(self, key: str):
method set_network_mode (line 283) | def set_network_mode(self, mode: str):
method add_port (line 286) | def add_port(self, port_config: dict | None = None, dev_config: dict |...
method set_entrypoint (line 313) | def set_entrypoint(self, entrypoint: list[str]):
method set_command (line 316) | def set_command(self, command: list[str]):
method add_network (line 319) | def add_network(self, network: str, config: dict = {}):
method add_storage (line 322) | def add_storage(self, mount_path: str, config: "IxStorage"):
method add_docker_socket (line 328) | def add_docker_socket(self, read_only: bool = True, mount_path: str = ...
method add_udev (line 332) | def add_udev(self, read_only: bool = True, mount_path: str = "/run/ude...
method add_tun_device (line 335) | def add_tun_device(self):
method add_snd_device (line 338) | def add_snd_device(self):
method add_usb_bus (line 342) | def add_usb_bus(self):
method setup_as_helper (line 345) | def setup_as_helper(self, profile: str = "low", disable_network: bool ...
method set_shm_size_mb (line 354) | def set_shm_size_mb(self, size: int):
method remove_devices (line 360) | def remove_devices(self):
method storage (line 365) | def storage(self):
method render (line 368) | def render(self) -> dict[str, Any]:
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/depends.py
class Depends (line 14) | class Depends:
method __init__ (line 15) | def __init__(self, render_instance: "Render"):
method add_dependency (line 19) | def add_dependency(self, name: str, condition: str):
method has_dependencies (line 30) | def has_dependencies(self):
method render (line 33) | def render(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/deploy.py
class Deploy (line 12) | class Deploy:
method __init__ (line 13) | def __init__(self, render_instance: "Render"):
method has_deploy (line 17) | def has_deploy(self):
method render (line 20) | def render(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/deps.py
class Deps (line 34) | class Deps:
method __init__ (line 35) | def __init__(self, render_instance: "Render"):
method perms (line 38) | def perms(self, name: str):
method postgres (line 41) | def postgres(self, name: str, image: str, config: PostgresConfig, perm...
method redis (line 44) | def redis(self, name: str, image: str, config: RedisConfig, perms_inst...
method mariadb (line 47) | def mariadb(self, name: str, image: str, config: MariadbConfig, perms_...
method mongodb (line 50) | def mongodb(self, name: str, image: str, config: MongoDBConfig, perms_...
method meilisearch (line 53) | def meilisearch(self, name: str, image: str, config: MeiliConfig, perm...
method elasticsearch (line 56) | def elasticsearch(self, name: str, image: str, config: ElasticConfig, ...
method solr (line 59) | def solr(self, name: str, image: str, config: SolrConfig, perms_instan...
method tika (line 62) | def tika(self, name: str, image: str, config: TikaConfig):
method memcached (line 65) | def memcached(self, name: str, image: str, config: MemcachedConfig):
method guacd (line 68) | def guacd(self, name: str, image: str, config: GuacdConfig):
method cron (line 71) | def cron(self, name: str, image: str, config: CronConfig):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/deps_cron.py
class TasksConfig (line 14) | class TasksConfig(TypedDict):
class CronConfig (line 19) | class CronConfig(TypedDict):
class CronContainer (line 26) | class CronContainer:
method __init__ (line 28) | def __init__(self, render_instance: "Render", name: str, image: str, c...
method container (line 67) | def container(self):
method _get_repo (line 70) | def _get_repo(self, image):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/deps_elastic.py
class ElasticConfig (line 17) | class ElasticConfig(TypedDict):
class ElasticSearchContainer (line 27) | class ElasticSearchContainer:
method __init__ (line 28) | def __init__(
method container (line 76) | def container(self):
method _get_repo (line 79) | def _get_repo(self, image):
method get_port (line 92) | def get_port(self):
method get_url (line 95) | def get_url(self):
method get_snapshots_dir (line 98) | def get_snapshots_dir(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/deps_guacd.py
class GuacdConfig (line 14) | class GuacdConfig(TypedDict):
class GuacdContainer (line 21) | class GuacdContainer:
method __init__ (line 22) | def __init__(self, render_instance: "Render", name: str, image: str, c...
method container (line 49) | def container(self):
method _get_repo (line 52) | def _get_repo(self, image):
method get_port (line 63) | def get_port(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/deps_mariadb.py
class MariadbConfig (line 17) | class MariadbConfig(TypedDict):
class MariadbContainer (line 30) | class MariadbContainer:
method __init__ (line 31) | def __init__(
method _get_repo (line 69) | def _get_repo(self, image):
method get_url (line 80) | def get_url(self, variant: str):
method get_port (line 90) | def get_port(self):
method container (line 94) | def container(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/deps_meilisearch.py
class MeiliConfig (line 17) | class MeiliConfig(TypedDict):
class MeilisearchContainer (line 26) | class MeilisearchContainer:
method __init__ (line 27) | def __init__(
method container (line 69) | def container(self):
method _get_repo (line 72) | def _get_repo(self, image):
method get_port (line 85) | def get_port(self):
method get_url (line 88) | def get_url(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/deps_memcached.py
class MemcachedConfig (line 14) | class MemcachedConfig(TypedDict):
class MemcachedContainer (line 22) | class MemcachedContainer:
method __init__ (line 24) | def __init__(self, render_instance: "Render", name: str, image: str, c...
method container (line 52) | def container(self):
method _get_repo (line 55) | def _get_repo(self, image):
method get_port (line 66) | def get_port(self):
method get_address (line 69) | def get_address(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/deps_mongodb.py
class MongoDBConfig (line 18) | class MongoDBConfig(TypedDict):
class MongoDBContainer (line 28) | class MongoDBContainer:
method __init__ (line 29) | def __init__(
method container (line 70) | def container(self):
method _get_repo (line 73) | def _get_repo(self, image):
method get_port (line 84) | def get_port(self):
method get_url (line 87) | def get_url(self, variant: str):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/deps_perms.py
class PermsContainer (line 18) | class PermsContainer:
method __init__ (line 19) | def __init__(self, render_instance: "Render", name: str):
method add_or_skip_action (line 25) | def add_or_skip_action(self, identifier: str, volume_config: "IxStorag...
method parse_action (line 35) | def parse_action(self, identifier: str, volume_config: "IxStorage", ac...
method normalize_identifier_for_path (line 102) | def normalize_identifier_for_path(self, identifier: str):
method has_actions (line 105) | def has_actions(self):
method activate (line 108) | def activate(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/deps_postgres.py
class PostgresConfig (line 21) | class PostgresConfig(TypedDict):
function get_major_version (line 51) | def get_major_version(variant: str, tag: str):
class PostgresContainer (line 112) | class PostgresContainer:
method __init__ (line 113) | def __init__(
method container (line 193) | def container(self):
method add_dependency (line 196) | def add_dependency(self, container_name: str, condition: str):
method _get_repo (line 201) | def _get_repo(self, image):
method _get_target_version (line 212) | def _get_target_version(self, image):
method get_port (line 231) | def get_port(self):
method get_url (line 234) | def get_url(self, variant: str):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/deps_redis.py
class RedisConfig (line 18) | class RedisConfig(TypedDict):
class RedisContainer (line 27) | class RedisContainer:
method __init__ (line 28) | def __init__(
method _get_repo (line 70) | def _get_repo(self, image):
method get_port (line 81) | def get_port(self):
method get_url (line 84) | def get_url(self, variant: str):
method container (line 97) | def container(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/deps_solr.py
class SolrConfig (line 17) | class SolrConfig(TypedDict):
class SolrContainer (line 27) | class SolrContainer:
method __init__ (line 28) | def __init__(
method container (line 71) | def container(self):
method _get_repo (line 74) | def _get_repo(self, image):
method get_port (line 85) | def get_port(self):
method get_url (line 88) | def get_url(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/deps_tika.py
class TikaConfig (line 14) | class TikaConfig(TypedDict):
class TikaContainer (line 21) | class TikaContainer:
method __init__ (line 22) | def __init__(self, render_instance: "Render", name: str, image: str, c...
method container (line 49) | def container(self):
method _get_repo (line 52) | def _get_repo(self, image):
method get_port (line 63) | def get_port(self):
method get_url (line 66) | def get_url(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/device.py
class Device (line 9) | class Device:
method __init__ (line 10) | def __init__(self, host_device: str, container_device: str, cgroup_per...
method render (line 27) | def render(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/device_cgroup_rules.py
class DeviceCGroupRule (line 14) | class DeviceCGroupRule:
method __init__ (line 15) | def __init__(self, rule: str):
method get_key (line 25) | def get_key(self):
method render (line 28) | def render(self):
class DeviceCGroupRules (line 32) | class DeviceCGroupRules:
method __init__ (line 33) | def __init__(self, render_instance: "Render"):
method add_rule (line 38) | def add_rule(self, rule: str):
method has_rules (line 50) | def has_rules(self):
method render (line 53) | def render(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/devices.py
class Devices (line 14) | class Devices:
method __init__ (line 15) | def __init__(self, render_instance: "Render"):
method _auto_add_devices_from_values (line 25) | def _auto_add_devices_from_values(self):
method add_device (line 33) | def add_device(self, host_device: str, container_device: str, cgroup_p...
method add_usb_bus (line 42) | def add_usb_bus(self):
method _add_snd_device (line 45) | def _add_snd_device(self):
method _add_tun_device (line 48) | def _add_tun_device(self):
method has_devices (line 51) | def has_devices(self):
method remove_devices (line 57) | def remove_devices(self):
method has_gpus (line 64) | def has_gpus(self):
method render (line 70) | def render(self) -> list[str]:
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/dns.py
class Dns (line 14) | class Dns:
method __init__ (line 15) | def __init__(self, render_instance: "Render"):
method _get_dns_opt_keys (line 25) | def _get_dns_opt_keys(self):
method _get_key_from_opt (line 28) | def _get_key_from_opt(self, opt):
method _auto_add_dns_opts_from_values (line 31) | def _auto_add_dns_opts_from_values(self):
method _auto_add_dns_searches_from_values (line 36) | def _auto_add_dns_searches_from_values(self):
method _auto_add_dns_nameservers_from_values (line 41) | def _auto_add_dns_nameservers_from_values(self):
method add_dns_search (line 46) | def add_dns_search(self, dns_search):
method add_dns_nameserver (line 51) | def add_dns_nameserver(self, dns_nameserver):
method add_dns_opt (line 56) | def add_dns_opt(self, dns_opt):
method has_dns_opts (line 63) | def has_dns_opts(self):
method has_dns_searches (line 66) | def has_dns_searches(self):
method has_dns_nameservers (line 69) | def has_dns_nameservers(self):
method render_dns_searches (line 72) | def render_dns_searches(self):
method render_dns_opts (line 75) | def render_dns_opts(self):
method render_dns_nameservers (line 78) | def render_dns_nameservers(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/docker_client.py
class DockerClient (line 15) | class DockerClient:
method __init__ (line 16) | def __init__(self, render_instance: "Render"):
method _auto_fetch_networks (line 29) | def _auto_fetch_networks(self):
method network_exists (line 44) | def network_exists(self, network_name: str) -> bool:
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/environment.py
class Environment (line 15) | class Environment:
method __init__ (line 16) | def __init__(self, render_instance: "Render", resources: Resources):
method _auto_add_variables_from_values (line 31) | def _auto_add_variables_from_values(self):
method _add_generic_variables (line 36) | def _add_generic_variables(self):
method _add_nvidia_variables (line 53) | def _add_nvidia_variables(self):
method _format_value (line 60) | def _format_value(self, v: Any) -> str:
method remove_auto_env (line 69) | def remove_auto_env(self, name: str):
method add_env (line 75) | def add_env(self, name: str, value: Any):
method add_user_envs (line 84) | def add_user_envs(self, user_env: list[dict]):
method has_variables (line 94) | def has_variables(self):
method render (line 97) | def render(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/error.py
class RenderError (line 1) | class RenderError(Exception):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/expose.py
class Expose (line 14) | class Expose:
method __init__ (line 15) | def __init__(self, render_instance: "Render"):
method add_port (line 19) | def add_port(self, port: int, protocol: str = "tcp"):
method has_ports (line 27) | def has_ports(self):
method render (line 30) | def render(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/extra_hosts.py
class ExtraHosts (line 13) | class ExtraHosts:
method __init__ (line 14) | def __init__(self, render_instance: "Render"):
method add_host (line 18) | def add_host(self, host: str, ip: str):
method has_hosts (line 29) | def has_hosts(self):
method render (line 32) | def render(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/formatter.py
function escape_dollar (line 5) | def escape_dollar(text: str) -> str:
function get_hashed_name_for_volume (line 9) | def get_hashed_name_for_volume(prefix: str, config: dict):
function get_hash_with_prefix (line 14) | def get_hash_with_prefix(prefix: str, data: str):
function merge_dicts_no_overwrite (line 18) | def merge_dicts_no_overwrite(dict1, dict2):
function get_image_with_hashed_data (line 25) | def get_image_with_hashed_data(image: str, data: str):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/functions.py
class Functions (line 21) | class Functions:
method __init__ (line 22) | def __init__(self, render_instance: "Render"):
method _to_yaml (line 25) | def _to_yaml(self, data):
method _bcrypt_hash (line 28) | def _bcrypt_hash(self, password: str, rounds: int = 12):
method _htpasswd (line 37) | def _htpasswd(self, username: str, password: str, rounds: int = 12):
method _secure_string (line 41) | def _secure_string(self, length):
method _basic_auth (line 44) | def _basic_auth(self, username, password):
method _basic_auth_header (line 47) | def _basic_auth_header(self, username, password):
method _fail (line 50) | def _fail(self, message):
method _camel_case (line 53) | def _camel_case(self, string):
method _auto_cast (line 56) | def _auto_cast(self, value):
method _match_regex (line 72) | def _match_regex(self, value, regex):
method _must_match_regex (line 77) | def _must_match_regex(self, value, regex):
method _is_boolean (line 82) | def _is_boolean(self, string):
method _is_number (line 85) | def _is_number(self, string):
method _copy_dict (line 92) | def _copy_dict(self, dict):
method _deep_merge (line 95) | def _deep_merge(self, dict1: dict, dict2: dict):
method _disallow_chars (line 113) | def _disallow_chars(self, string: str, chars: list[str], key: str):
method _or_default (line 119) | def _or_default(self, value, default):
method _url_to_dict (line 124) | def _url_to_dict(self, url: str, v6_brackets: bool = False):
method _require_unique (line 157) | def _require_unique(self, values, key, split_char=""):
method _require_no_reserved (line 165) | def _require_no_reserved(self, values, key, reserved, split_char="", s...
method _url_encode (line 181) | def _url_encode(self, string):
method _temp_config (line 184) | def _temp_config(self, name):
method _get_host_path (line 189) | def _get_host_path(self, storage):
method has_amd_gpu (line 210) | def has_amd_gpu(self):
method has_nvidia_gpu (line 216) | def has_nvidia_gpu(self):
method func_map (line 224) | def func_map(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/healthcheck.py
class Healthcheck (line 17) | class Healthcheck:
method __init__ (line 18) | def __init__(self, render_instance: "Render"):
method _get_test (line 29) | def _get_test(self):
method disable (line 34) | def disable(self):
method use_built_in (line 37) | def use_built_in(self):
method set_custom_test (line 40) | def set_custom_test(self, test: str | list[str]):
method set_test (line 48) | def set_test(self, variant: str, config: dict | None = None):
method set_interval (line 52) | def set_interval(self, interval: int):
method set_timeout (line 55) | def set_timeout(self, timeout: int):
method set_retries (line 58) | def set_retries(self, retries: int):
method set_start_period (line 61) | def set_start_period(self, start_period: int):
method set_start_interval (line 64) | def set_start_interval(self, start_interval: int):
method has_healthcheck (line 67) | def has_healthcheck(self):
method render (line 70) | def render(self):
function test_mapping (line 90) | def test_mapping(variant: str, config: dict | None = None) -> list[str]:
function get_key (line 112) | def get_key(config: dict, key: str, default: Any, required: bool):
function curl_test (line 120) | def curl_test(config: dict) -> list[str]:
function wget_test (line 147) | def wget_test(config: dict) -> list[str]:
function http_test (line 189) | def http_test(config: dict) -> list[str]:
function netcat_test (line 199) | def netcat_test(config: dict) -> list[str]:
function tcp_test (line 214) | def tcp_test(config: dict) -> list[str]:
function redis_test (line 222) | def redis_test(config: dict) -> list[str]:
function postgres_test (line 237) | def postgres_test(config: dict) -> list[str]:
function mariadb_test (line 247) | def mariadb_test(config: dict) -> list[str]:
function mongodb_test (line 264) | def mongodb_test(config: dict) -> list[str]:
function pidof_test (line 284) | def pidof_test(config: dict) -> list[str]:
function pgrep_test (line 292) | def pgrep_test(config: dict) -> list[str]:
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/labels.py
class Labels (line 11) | class Labels:
method __init__ (line 12) | def __init__(self):
method add_label (line 15) | def add_label(self, key: str, value: str):
method has_labels (line 23) | def has_labels(self) -> bool:
method render (line 26) | def render(self) -> dict[str, str]:
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/networks.py
class Networks (line 17) | class Networks:
method __init__ (line 18) | def __init__(self, render_instance: "Render"):
method _auto_set_app_name (line 25) | def _auto_set_app_name(self):
method create_internal (line 31) | def create_internal(self, name: str) -> str:
method register (line 52) | def register(self, name: str):
method has_items (line 68) | def has_items(self):
method exists (line 71) | def exists(self, name: str):
method render (line 74) | def render(self):
class NetworkConfig (line 82) | class NetworkConfig:
method __post_init__ (line 94) | def __post_init__(self):
class Network (line 107) | class Network:
method __init__ (line 108) | def __init__(self, name: str, config: dict = {}):
method render (line 112) | def render(self):
class ContainerNetworkConfig (line 131) | class ContainerNetworkConfig:
class ContainerNetworks (line 148) | class ContainerNetworks:
method __init__ (line 149) | def __init__(self, render_instance: "Render"):
method add (line 153) | def add(self, container_name: str, net_name: str, config: dict = {}):
method has_items (line 218) | def has_items(self):
method exists (line 221) | def exists(self, name: str):
method render (line 224) | def render(self):
class ContainerNetwork (line 231) | class ContainerNetwork:
method __init__ (line 232) | def __init__(self, name: str, config: dict = {}):
method render (line 236) | def render(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/notes.py
class Security (line 11) | class Security:
class Notes (line 16) | class Notes:
method __init__ (line 17) | def __init__(self, render_instance: "Render"):
method _is_enterprise_train (line 33) | def _is_enterprise_train(self):
method _auto_set_app_name (line 37) | def _auto_set_app_name(self):
method _auto_set_app_train (line 41) | def _auto_set_app_train(self):
method _auto_set_footer (line 45) | def _auto_set_footer(self):
method _set_header (line 54) | def _set_header(self):
method add_info (line 61) | def add_info(self, info: str):
method add_warning (line 64) | def add_warning(self, warning: str):
method _prepend_warning (line 67) | def _prepend_warning(self, warning: str):
method add_deprecation (line 70) | def add_deprecation(self, deprecation: str):
method has_deprecations (line 73) | def has_deprecations(self) -> bool:
method has_warnings (line 76) | def has_warnings(self) -> bool:
method set_body (line 79) | def set_body(self, body: str):
method get_pretty_host_mount (line 82) | def get_pretty_host_mount(self, hm: str) -> tuple[str, bool]:
method get_group_name_from_id (line 118) | def get_group_name_from_id(self, group_id: int | str) -> str:
method scan_containers (line 131) | def scan_containers(self):
method render (line 246) | def render(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/portals.py
class Portals (line 16) | class Portals:
method __init__ (line 17) | def __init__(self, render_instance: "Render"):
method add (line 21) | def add(self, port: dict, config: dict | None = None):
method render (line 54) | def render(self):
class Portal (line 58) | class Portal:
method __init__ (line 59) | def __init__(self, name: str, config: dict):
method render (line 66) | def render(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/ports.py
class Ports (line 27) | class Ports:
method __init__ (line 28) | def __init__(self, render_instance: "Render"):
method _gen_port_key (line 34) | def _gen_port_key(self, host_port: int, host_ip: str, proto: str, ip_f...
method _is_wildcard_ip (line 37) | def _is_wildcard_ip(self, ip: str) -> bool:
method _get_opposite_wildcard (line 40) | def _get_opposite_wildcard(self, ip: str) -> str:
method _get_sort_key (line 43) | def _get_sort_key(self, p: dict) -> str:
method _is_ports_same (line 46) | def _is_ports_same(self, port1: dict, port2: dict) -> bool:
method _has_opposite_family_port (line 54) | def _has_opposite_family_port(self, port_config: dict, wildcard_ports:...
method _check_port_conflicts_in_this_app (line 62) | def _check_port_conflicts_in_this_app(self, port_config: dict, ip_fami...
method _add_port (line 101) | def _add_port(self, host_port: int, container_port: int, config: dict ...
method has_ports (line 126) | def has_ports(self):
method render (line 129) | def render(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/render.py
class Render (line 29) | class Render(object):
method __init__ (line 30) | def __init__(self, values):
method _auto_add_networks (line 50) | def _auto_add_networks(self):
method container_names (line 58) | def container_names(self):
method add_container (line 61) | def add_container(self, name: str, image: str):
method render (line 71) | def render(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/resources.py
class Resources (line 16) | class Resources:
method __init__ (line 17) | def __init__(self, render_instance: "Render"):
method _set_cpu (line 26) | def _set_cpu(self, cpus: Any):
method _set_memory (line 32) | def _set_memory(self, memory: Any):
method _auto_add_cpu_from_values (line 38) | def _auto_add_cpu_from_values(self):
method _auto_add_memory_from_values (line 42) | def _auto_add_memory_from_values(self):
method _auto_add_gpus_from_values (line 46) | def _auto_add_gpus_from_values(self):
method remove_cpus_and_memory (line 72) | def remove_cpus_and_memory(self):
method remove_devices (line 79) | def remove_devices(self):
method set_profile (line 82) | def set_profile(self, profile: str):
method has_resources (line 87) | def has_resources(self):
method has_gpus (line 90) | def has_gpus(self):
method render (line 94) | def render(self):
function profile_mapping (line 104) | def profile_mapping(profile: str):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/restart.py
class RestartPolicy (line 12) | class RestartPolicy:
method __init__ (line 13) | def __init__(self, render_instance: "Render"):
method set_policy (line 18) | def set_policy(self, policy: str, maximum_retry_count: int = 0):
method render (line 22) | def render(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/security_opts.py
class SecurityOpt (line 14) | class SecurityOpt:
method __init__ (line 15) | def __init__(self, opt: str, value: str | bool | None = None, arg: str...
method render (line 20) | def render(self):
class SecurityOpts (line 29) | class SecurityOpts:
method __init__ (line 30) | def __init__(self, render_instance: "Render"):
method add_opt (line 35) | def add_opt(self, key: str, value: str | bool | None, arg: str | None ...
method remove_opt (line 40) | def remove_opt(self, key: str):
method has_opts (line 45) | def has_opts(self):
method render (line 48) | def render(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/storage.py
class IxStorageTmpfsConfig (line 17) | class IxStorageTmpfsConfig(TypedDict):
class AclConfig (line 24) | class AclConfig(TypedDict, total=False):
class IxStorageHostPathConfig (line 28) | class IxStorageHostPathConfig(TypedDict):
class IxStorageIxVolumeConfig (line 37) | class IxStorageIxVolumeConfig(TypedDict):
class IxStorageVolumeConfig (line 46) | class IxStorageVolumeConfig(TypedDict):
class IxStorageNfsConfig (line 52) | class IxStorageNfsConfig(TypedDict):
class IxStorageCifsConfig (line 58) | class IxStorageCifsConfig(TypedDict):
class IxStorage (line 72) | class IxStorage(TypedDict):
class Storage (line 84) | class Storage:
method __init__ (line 85) | def __init__(self, render_instance: "Render", container_instance: "Con...
method add (line 90) | def add(self, mount_path: str, config: "IxStorage"):
method is_defined (line 100) | def is_defined(self, mount_path: str):
method _add_docker_socket (line 103) | def _add_docker_socket(self, read_only: bool = True, mount_path: str =...
method _add_udev (line 112) | def _add_udev(self, read_only: bool = True, mount_path: str = ""):
method has_mounts (line 121) | def has_mounts(self) -> bool:
method render (line 124) | def render(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/sysctls.py
class Sysctls (line 15) | class Sysctls:
method __init__ (line 16) | def __init__(self, render_instance: "Render", container_instance: "Con...
method add (line 21) | def add(self, key: str, value):
method has_sysctls (line 31) | def has_sysctls(self):
method render (line 34) | def render(self):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/tests/test_build_image.py
function mock_values (line 7) | def mock_values():
function test_build_image_with_from (line 18) | def test_build_image_with_from(mock_values):
function test_build_image_with_from_with_whitespace (line 26) | def test_build_image_with_from_with_whitespace(mock_values):
function test_build_image (line 34) | def test_build_image(mock_values):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/tests/test_configs.py
function mock_values (line 7) | def mock_values():
function test_add_duplicate_config_with_different_data (line 18) | def test_add_duplicate_config_with_different_data(mock_values):
function test_add_config_with_empty_target (line 27) | def test_add_config_with_empty_target(mock_values):
function test_add_config_with_empty_data (line 35) | def test_add_config_with_empty_data(mock_values):
function test_add_duplicate_target (line 43) | def test_add_duplicate_target(mock_values):
function test_add_config (line 52) | def test_add_config(mock_values):
function test_add_config_with_mode (line 62) | def test_add_config_with_mode(mock_values):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/tests/test_container.py
function mock_values (line 8) | def mock_values():
function test_empty_container_name (line 19) | def test_empty_container_name(mock_values):
function test_resolve_image (line 25) | def test_resolve_image(mock_values):
function test_missing_repo (line 33) | def test_missing_repo(mock_values):
function test_missing_tag (line 40) | def test_missing_tag(mock_values):
function test_non_existing_image (line 47) | def test_non_existing_image(mock_values):
function test_pull_policy (line 53) | def test_pull_policy(mock_values):
function test_invalid_pull_policy (line 62) | def test_invalid_pull_policy(mock_values):
function test_clear_caps (line 69) | def test_clear_caps(mock_values):
function test_privileged (line 80) | def test_privileged(mock_values):
function test_tty (line 89) | def test_tty(mock_values):
function test_init (line 98) | def test_init(mock_values):
function test_read_only (line 107) | def test_read_only(mock_values):
function test_stdin (line 116) | def test_stdin(mock_values):
function test_hostname (line 125) | def test_hostname(mock_values):
function test_grace_period (line 134) | def test_grace_period(mock_values):
function test_user (line 143) | def test_user(mock_values):
function test_invalid_user (line 152) | def test_invalid_user(mock_values):
function test_add_group (line 160) | def test_add_group(mock_values):
function test_add_duplicate_group (line 170) | def test_add_duplicate_group(mock_values):
function test_add_group_as_string (line 179) | def test_add_group_as_string(mock_values):
function test_add_docker_socket (line 187) | def test_add_docker_socket(mock_values):
function test_snd_device (line 208) | def test_snd_device(mock_values):
function test_shm_size (line 218) | def test_shm_size(mock_values):
function test_valid_caps (line 227) | def test_valid_caps(mock_values):
function test_add_duplicate_caps (line 237) | def test_add_duplicate_caps(mock_values):
function test_invalid_caps (line 245) | def test_invalid_caps(mock_values):
function test_network_mode (line 253) | def test_network_mode(mock_values):
function test_auto_network_mode_with_host_network (line 262) | def test_auto_network_mode_with_host_network(mock_values):
function test_network_mode_with_container (line 271) | def test_network_mode_with_container(mock_values):
function test_network_mode_with_container_missing (line 280) | def test_network_mode_with_container_missing(mock_values):
function test_invalid_network_mode (line 288) | def test_invalid_network_mode(mock_values):
function test_entrypoint (line 296) | def test_entrypoint(mock_values):
function test_command (line 305) | def test_command(mock_values):
function test_add_ports (line 314) | def test_add_ports(mock_values):
function test_add_ports_with_invalid_host_ips (line 335) | def test_add_ports_with_invalid_host_ips(mock_values):
function test_add_ports_with_empty_host_ips (line 343) | def test_add_ports_with_empty_host_ips(mock_values):
function test_set_ipc_mode (line 354) | def test_set_ipc_mode(mock_values):
function test_set_ipc_empty_mode (line 363) | def test_set_ipc_empty_mode(mock_values):
function test_set_ipc_mode_with_invalid_ipc_mode (line 372) | def test_set_ipc_mode_with_invalid_ipc_mode(mock_values):
function test_set_ipc_mode_with_container_ipc_mode (line 380) | def test_set_ipc_mode_with_container_ipc_mode(mock_values):
function test_set_ipc_mode_with_container_ipc_mode_and_invalid_container (line 391) | def test_set_ipc_mode_with_container_ipc_mode_and_invalid_container(mock...
function test_set_pid_mode (line 399) | def test_set_pid_mode(mock_values):
function test_set_pid_empty_mode (line 408) | def test_set_pid_empty_mode(mock_values):
function test_set_pid_mode_with_invalid_pid_mode (line 417) | def test_set_pid_mode_with_invalid_pid_mode(mock_values):
function test_set_pid_mode_with_container_pid_mode (line 425) | def test_set_pid_mode_with_container_pid_mode(mock_values):
function test_set_pid_mode_with_container_pid_mode_and_invalid_container (line 436) | def test_set_pid_mode_with_container_pid_mode_and_invalid_container(mock...
function test_set_cgroup (line 444) | def test_set_cgroup(mock_values):
function test_set_cgroup_invalid (line 453) | def test_set_cgroup_invalid(mock_values):
function test_set_mac_invalid (line 461) | def test_set_mac_invalid(mock_values):
function test_set_mac_valid (line 469) | def test_set_mac_valid(mock_values):
function test_setup_as_helper (line 478) | def test_setup_as_helper(mock_values):
function test_setup_as_helper_med_profile (line 492) | def test_setup_as_helper_med_profile(mock_values):
function test_setup_as_helper_no_profile (line 506) | def test_setup_as_helper_no_profile(mock_values):
function test_setup_as_helper_with_net (line 520) | def test_setup_as_helper_with_net(mock_values):
function test_container_name (line 533) | def test_container_name(mock_values):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/tests/test_depends.py
function mock_values (line 8) | def mock_values():
function test_add_dependency (line 19) | def test_add_dependency(mock_values):
function test_add_dependency_invalid_condition (line 30) | def test_add_dependency_invalid_condition(mock_values):
function test_add_dependency_missing_container (line 39) | def test_add_dependency_missing_container(mock_values):
function test_add_dependency_duplicate (line 47) | def test_add_dependency_duplicate(mock_values):
FILE: ix-dev/community/adventurelog/templates/library/base_v2_3_4/tests/test_deps.py
function mock_values (line 8) | def mock_values():
function test_add_postgres_missing_config (line 27) | def test_add_postgres_missing_config(mock_values):
function test_add_postgres_unsupported_repo (line 39) | def test_add_postgres_unsupported_repo(mock_values):
function test_add_postgres (line 59) | def test_add_postgres(mock_values):
function test_add_postgres_options (line 137) | def test_add_postgres_options(mock_values):
function test_add_redis_missing_config (line 165) | def test_add_redis_missing_config(mock_values):
function test_add_redis_unsupported_repo (line 177) | def test_add_redis_unsupported_repo(mock_values):
function test_add_redis_with_password_with_spaces (line 195) | def test_add_redis_with_password_with_spaces(mock_values):
function test_add_redis (line 208) | def test_add_redis(mock_values):
function test_add_mariadb_missing_config (line 279) | def test_add_mariadb_missing_config(mock_values):
function test_add_mariadb_unsupported_repo (line 291) | def test_add_mariadb_unsupported_repo(mock_values):
function test_add_mariadb (line 311) | def test_add_mariadb(mock_values):
function test_add_perms_container (line 380) | def test_add_perms_container(mock_values):
function test_add_duplicate_perms_action (line 488) | def test_add_duplicate_perms_action(mock_values):
function test_add_perm_action_without_auto_perms_enabled (line 500) | def test_add_perm_action_without_auto_perms_enabled(mock_values):
function test_add_unsupported_postgres_version (line 517) | def test_add_unsupported_postgres_version(mock_values):
function test_add_postgres_with_invalid_tag (line 530) | def test_add_postgres_with_invalid_tag(mock_values):
function test_postgres_with_upgrade_container (line 543) | def test_postgres_with_upgrade_container(mock_values):
function test_postgres_version_with_digest_pin (line 584) | def test_postgres_version_with_digest_pin(mock_values):
function test_add_mongodb (line 609) | def test_add_mongodb(mock_values):
function test_
Copy disabled (too large)
Download .json
Condensed preview — 65499 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (114,062K chars).
[
{
"path": ".flake8",
"chars": 31,
"preview": "[flake8]\nmax-line-length = 120\n"
},
{
"path": ".gitattributes",
"chars": 63,
"preview": "ix-dev/*/*/templates/library/base_*/** linguist-generated=true\n"
},
{
"path": ".github/ISSUE_TEMPLATE/app-request.yaml",
"chars": 2894,
"preview": "name: App Request\ndescription: Request an app to be added to the catalog\ntitle: \"[App Request]: \"\nlabels: [\"app-request\""
},
{
"path": ".github/ISSUE_TEMPLATE/bug-report.yaml",
"chars": 1492,
"preview": "name: Bug Report\ndescription: Report a bug with an app\ntitle: \"[Bug Report]: \"\nlabels: [\"bug\", \"triage\"]\nbody:\n - type:"
},
{
"path": ".github/ISSUE_TEMPLATE/enhancement-request.yaml",
"chars": 2186,
"preview": "name: Enhancement Request\ndescription: Request an enhancement or improvement to an existing app\ntitle: \"[Enhancement]: \""
},
{
"path": ".github/PULL_REQUEST_TEMPLATE/app_addition.md",
"chars": 1070,
"preview": "# App Addition\n\n- [ ] I have opened an [issue](https://github.com/truenas/apps/issues) to discuss this app addition befo"
},
{
"path": ".github/copilot-instructions.md",
"chars": 404,
"preview": "# Copilot Instructions\n\n## Files to Ignore\n\nDo not suggest code completions, changes, edits, or code reviews for files m"
},
{
"path": ".github/pull_request_template.md",
"chars": 184,
"preview": "# Pull Request\n\n⚠️⚠️⚠️ **BEFORE CREATING THE PR** ⚠️⚠️⚠️\n\nPlease go to the **Preview** tab and select the appropriate te"
},
{
"path": ".github/renovate-config.js",
"chars": 12431,
"preview": "module.exports = {\n extends: [],\n // https://docs.renovatebot.com/self-hosted-configuration/#dryrun\n dryRun: null,\n "
},
{
"path": ".github/renovate.json",
"chars": 3,
"preview": "{}\n"
},
{
"path": ".github/scripts/changed_apps.py",
"chars": 3061,
"preview": "#!/usr/bin/env python3\n\nimport pathlib\nimport json\nimport sys\nimport re\n\nAPP_REGEX = re.compile(r\"^ix-dev\\/([-\\w\\.]+)\\/("
},
{
"path": ".github/scripts/ci.py",
"chars": 17312,
"preview": "#!/usr/bin/env python3\n\n# /// script\n# requires-python = \">=3.11\"\n# dependencies = [\n# \"pyyaml\",\n# ]\n# ///\n\nimport s"
},
{
"path": ".github/scripts/generate_metadata.py",
"chars": 48339,
"preview": "#!/usr/bin/env python3\n\"\"\"\nTrueNAS Apps Capability Manager\n\nThis script analyzes Docker Compose configurations for TrueN"
},
{
"path": ".github/scripts/message.py",
"chars": 3419,
"preview": "import sys\nimport json\n\n\ndef get_files_from_file(file: str):\n with open(file, \"r\") as f:\n json_files = f.read("
},
{
"path": ".github/scripts/port_validation.py",
"chars": 3751,
"preview": "#!/usr/bin/python3\n\n# /// script\n# requires-python = \">=3.11\"\n# dependencies = [\n# \"pyyaml\",\n# ]\n# ///\n\nimport sys\ni"
},
{
"path": ".github/scripts/renovate_bump.sh",
"chars": 1013,
"preview": "#!/bin/bash\n\napp_path=$1\nupdate_type=$2\ndep_name=$3\ndep_version=$4\nbase_branch=$5\n\nif [[ -z \"$base_branch\" ]]; then\n ec"
},
{
"path": ".github/workflows/app-test-suite.yaml",
"chars": 5862,
"preview": "name: Apps Test Suite\n\non:\n pull_request: {}\n\njobs:\n changed-files:\n name: Generate matrix\n runs-on: ubuntu-late"
},
{
"path": ".github/workflows/dev_apps_validate.yml",
"chars": 719,
"preview": "name: dev_catalog_validation\n\non:\n push:\n pull_request:\n workflow_dispatch:\n\njobs:\n ix-dev-validate:\n runs-on: ub"
},
{
"path": ".github/workflows/library-tests.yaml",
"chars": 562,
"preview": "name: Unit Tests\n\non:\n pull_request:\n paths:\n - \"library/**\"\n\njobs:\n run-unit-test:\n name: Run Unit Tests\n "
},
{
"path": ".github/workflows/python-lint.yaml",
"chars": 447,
"preview": "name: flake8\n\non: [push]\n\njobs:\n build:\n runs-on: ubuntu-latest\n steps:\n - name: Checkout\n uses: acti"
},
{
"path": ".github/workflows/renovate.yaml",
"chars": 2294,
"preview": "name: Renovate\n\non:\n workflow_dispatch:\n schedule:\n - cron: \"0 12 * * *\"\n\nconcurrency:\n group: renovate\n cancel-i"
},
{
"path": ".github/workflows/update_catalog.yaml",
"chars": 1821,
"preview": "name: catalog_update\n\nconcurrency:\n group: apps_catalog_update\n\non:\n push:\n branches:\n - \"master\"\n workflow_d"
},
{
"path": ".gitignore",
"chars": 97,
"preview": "ix-dev/**/rendered\nout.yaml\n\n.devbox\n.vscode\n.DS_Store\n.venv\n.pytest_cache\n.coverage\n__pycache__\n"
},
{
"path": "CONTRIBUTIONS.md",
"chars": 43215,
"preview": "# Contributing to TrueNAS Apps Catalog\n\nThis guide will walk you through everything you need to know about\ncontributing "
},
{
"path": "LICENSE",
"chars": 7652,
"preview": " GNU LESSER GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007"
},
{
"path": "README.md",
"chars": 14235,
"preview": "# TrueNAS Apps Catalog\n\nThis repository contains the Docker-Compose based App catalog used by TrueNAS systems to render "
},
{
"path": "catalog.json",
"chars": 944099,
"preview": "{\n \"stable\": {\n \"wg-easy\": {\n \"app_readme\": \"<h1>WG-Easy</h1> <p><a href=\\\"https://github.com/wg-ea"
},
{
"path": "cspell.config.yaml",
"chars": 7067,
"preview": "words:\n - 2fauth\n - ACPI\n - adguard\n - adventurelog\n - aiostreams\n - airtable\n - aistor\n - aliyun\n - allinkl\n "
},
{
"path": "devbox.json",
"chars": 1772,
"preview": "{\n \"$schema\": \"https://raw.githubusercontent.com/jetify-com/devbox/0.16.0/.schema/devbox.schema.json\",\n \"packages\": [\n"
},
{
"path": "features_capability.json",
"chars": 858,
"preview": "{\n \"normalize/acl\": {\n \"stable\": {\"min\": \"24.10-ALPHA\"},\n \"nightlies\": {\"min\": \"24.10-MASTER-somever\"}\n },\n \"no"
},
{
"path": "ix-dev/community/actual-budget/README.md",
"chars": 128,
"preview": "# Actual Budget\n\n[Actual Budget](https://actualbudget.org/) is a super fast and privacy-focused app for managing your fi"
},
{
"path": "ix-dev/community/actual-budget/app.yaml",
"chars": 1236,
"preview": "annotations:\n min_scale_version: 24.10.2.2\napp_version: 26.4.0\ncapabilities: []\ncategories:\n- financial\nchangelog_url: "
},
{
"path": "ix-dev/community/actual-budget/app_migrations.yaml",
"chars": 103,
"preview": "migrations:\n- file: ip_port_migration\n from:\n max_version: 1.2.20\n target:\n min_version: 1.3.0\n"
},
{
"path": "ix-dev/community/actual-budget/item.yaml",
"chars": 373,
"preview": "categories:\n- financial\nicon_url: https://media.sys.truenas.net/apps/actual-budget/icons/icon.png\nscreenshots:\n- https:/"
},
{
"path": "ix-dev/community/actual-budget/ix_values.yaml",
"chars": 335,
"preview": "images:\n image:\n repository: actualbudget/actual-server\n tag: 26.4.0\n container_utils_image:\n repository: ixs"
},
{
"path": "ix-dev/community/actual-budget/migrations/ip_port_migration",
"chars": 465,
"preview": "#!/usr/bin/python3\n\nimport os\nimport sys\nimport yaml\n\n\ndef migrate(values):\n values[\"network\"][\"web_port\"] = {\n "
},
{
"path": "ix-dev/community/actual-budget/questions.yaml",
"chars": 21648,
"preview": "groups:\n - name: Actual Budget Configuration\n description: Configure Actual Budget\n - name: User and Group Configur"
},
{
"path": "ix-dev/community/actual-budget/templates/docker-compose.yaml",
"chars": 2211,
"preview": "{% set tpl = ix_lib.base.render.Render(values) %}\n\n{% set c1 = tpl.add_container(values.consts.actual_budget_container_n"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/configs.py",
"chars": 2886,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .error import RenderErr"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/container.py",
"chars": 18084,
"preview": "from typing import Any, TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n from storage import IxStorage"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/depends.py",
"chars": 1195,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .error import RenderErr"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/deploy.py",
"chars": 581,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .resources import Resou"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/deps.py",
"chars": 3645,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .deps_cron import CronC"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/deps_cron.py",
"chars": 2410,
"preview": "from typing import TYPE_CHECKING, TypedDict\n\n\nif TYPE_CHECKING:\n from render import Render\n\n\ntry:\n from .error imp"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/deps_elastic.py",
"chars": 3327,
"preview": "from typing import TYPE_CHECKING, TypedDict, NotRequired\n\n\nif TYPE_CHECKING:\n from render import Render\n from stor"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/deps_guacd.py",
"chars": 1933,
"preview": "from typing import TYPE_CHECKING, TypedDict, NotRequired\n\n\nif TYPE_CHECKING:\n from render import Render\n\n\ntry:\n fr"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/deps_mariadb.py",
"chars": 3364,
"preview": "from typing import TYPE_CHECKING, TypedDict, NotRequired\n\nif TYPE_CHECKING:\n from render import Render\n from stora"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/deps_meilisearch.py",
"chars": 2931,
"preview": "from typing import TYPE_CHECKING, TypedDict, NotRequired\n\n\nif TYPE_CHECKING:\n from render import Render\n from stor"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/deps_memcached.py",
"chars": 2119,
"preview": "from typing import TYPE_CHECKING, TypedDict, NotRequired\n\n\nif TYPE_CHECKING:\n from render import Render\n\n\ntry:\n fr"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/deps_mongodb.py",
"chars": 3338,
"preview": "import urllib.parse\nfrom typing import TYPE_CHECKING, TypedDict\n\n\nif TYPE_CHECKING:\n from render import Render\n fr"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/deps_perms.py",
"chars": 5569,
"preview": "import json\nimport pathlib\nfrom typing import TYPE_CHECKING\n\n\nif TYPE_CHECKING:\n from render import Render\n from s"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/deps_postgres.py",
"chars": 8985,
"preview": "import re\nimport urllib.parse\nfrom typing import TYPE_CHECKING, TypedDict, NotRequired\n\n\nif TYPE_CHECKING:\n from rend"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/deps_redis.py",
"chars": 3373,
"preview": "import urllib.parse\nfrom typing import TYPE_CHECKING, TypedDict, NotRequired\n\nif TYPE_CHECKING:\n from render import R"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/deps_solr.py",
"chars": 2893,
"preview": "from typing import TYPE_CHECKING, TypedDict, NotRequired, List\n\n\nif TYPE_CHECKING:\n from render import Render\n fro"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/deps_tika.py",
"chars": 2041,
"preview": "from typing import TYPE_CHECKING, TypedDict, NotRequired\n\n\nif TYPE_CHECKING:\n from render import Render\n\n\ntry:\n fr"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/device.py",
"chars": 1244,
"preview": "try:\n from .error import RenderError\n from .validations import valid_fs_path_or_raise, allowed_device_or_raise, va"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/device_cgroup_rules.py",
"chars": 1664,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .error import RenderErr"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/devices.py",
"chars": 2645,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .error import RenderErr"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/dns.py",
"chars": 2705,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .error import RenderErr"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/docker_client.py",
"chars": 1286,
"preview": "import docker\nfrom typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .error im"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/environment.py",
"chars": 4934,
"preview": "from typing import Any, TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\ntry:\n from .error import Rende"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/error.py",
"chars": 92,
"preview": "class RenderError(Exception):\n \"\"\"Base class for exceptions in this module.\"\"\"\n\n pass\n"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/expose.py",
"chars": 941,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .error import RenderErr"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/extra_hosts.py",
"chars": 943,
"preview": "import ipaddress\nfrom typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .error"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/formatter.py",
"chars": 759,
"preview": "import json\nimport hashlib\n\n\ndef escape_dollar(text: str) -> str:\n return text.replace(\"$\", \"$$\")\n\n\ndef get_hashed_na"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/functions.py",
"chars": 9253,
"preview": "import re\nimport copy\nimport yaml\nimport bcrypt\nimport secrets\nimport urllib.parse\nfrom base64 import b64encode\nfrom typ"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/healthcheck.py",
"chars": 9111,
"preview": "import json\nfrom typing import Any, TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .error"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/labels.py",
"chars": 858,
"preview": "try:\n from .error import RenderError\n from .formatter import escape_dollar\n from .validations import valid_labe"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/networks.py",
"chars": 11424,
"preview": "from typing import TYPE_CHECKING\nfrom dataclasses import dataclass\n\nif TYPE_CHECKING:\n from render import Render\n\ntry"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/notes.py",
"chars": 12225,
"preview": "from dataclasses import dataclass\nfrom typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\nSHO"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/portals.py",
"chars": 2383,
"preview": "from typing import TYPE_CHECKING\n\nimport copy\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .error imp"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/ports.py",
"chars": 6071,
"preview": "import ipaddress\nfrom typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .error"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/render.py",
"chars": 3686,
"preview": "import copy\n\ntry:\n from .configs import Configs\n from .container import Container\n from .deps import Deps\n f"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/resources.py",
"chars": 3775,
"preview": "import re\nfrom typing import Any, TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .error i"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/restart.py",
"chars": 834,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .validations import val"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/security_opts.py",
"chars": 1673,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .error import RenderErr"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/storage.py",
"chars": 4409,
"preview": "from typing import TYPE_CHECKING, TypedDict, Literal, NotRequired, Union\n\nif TYPE_CHECKING:\n from container import Co"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/sysctls.py",
"chars": 1222,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n from container import Container\n\nt"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_build_image.py",
"chars": 1508,
"preview": "import pytest\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_configs.py",
"chars": 2378,
"preview": "import pytest\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_container.py",
"chars": 19116,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_depends.py",
"chars": 1758,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_deps.py",
"chars": 45273,
"preview": "import json\nimport pytest\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\":"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_device.py",
"chars": 5216,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_device_cgroup_rules.py",
"chars": 2348,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_dns.py",
"chars": 2102,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_environment.py",
"chars": 6745,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_expose.py",
"chars": 1268,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_extra_hosts.py",
"chars": 1695,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_formatter.py",
"chars": 430,
"preview": "from formatter import escape_dollar\n\n\ndef test_escape_dollar():\n cases = [\n {\"input\": \"test\", \"expected\": \"tes"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_functions.py",
"chars": 7095,
"preview": "import re\nimport pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": "
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_healthcheck.py",
"chars": 12277,
"preview": "import pytest\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_labels.py",
"chars": 2639,
"preview": "import pytest\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_networks.py",
"chars": 11858,
"preview": "import pytest\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"ix_context\": {\n "
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_notes.py",
"chars": 9432,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"ix_context\": {\n "
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_portal.py",
"chars": 3590,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_ports.py",
"chars": 13200,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_render.py",
"chars": 818,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_resources.py",
"chars": 4902,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_restart.py",
"chars": 1764,
"preview": "import pytest\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_security_opts.py",
"chars": 2906,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_sysctls.py",
"chars": 1765,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_truenas_client.py",
"chars": 7933,
"preview": "import pytest\nfrom unittest.mock import MagicMock\n\nfrom truenas_client import TNClient, PortCombo, ValidationErrors, Ren"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_validations.py",
"chars": 4326,
"preview": "import pytest\nfrom unittest.mock import patch\n\nfrom pathlib import Path\nfrom validations import is_allowed_path, RESTRIC"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tests/test_volumes.py",
"chars": 26958,
"preview": "import pytest\n\n\nfrom render import Render\nfrom formatter import get_hashed_name_for_volume\n\n\n@pytest.fixture\ndef mock_va"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/tmpfs.py",
"chars": 2851,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from container import Container\n from render import Render\n "
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/truenas_client.py",
"chars": 4857,
"preview": "from dataclasses import asdict, dataclass\nfrom typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Ren"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/validations.py",
"chars": 11915,
"preview": "import os\nimport re\nimport ipaddress\nfrom pathlib import Path\n\n\ntry:\n from .error import RenderError\nexcept ImportErr"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/volume_mount.py",
"chars": 4605,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n from storage import IxStorage\n\ntry"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/volume_mount_types.py",
"chars": 1290,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n from storage import IxStorageVolum"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/volume_sources.py",
"chars": 3741,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n from storage import IxStorageHostP"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/volume_types.py",
"chars": 4473,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n from storage import IxStorageNfsCo"
},
{
"path": "ix-dev/community/actual-budget/templates/library/base_v2_3_4/volumes.py",
"chars": 2160,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\n\ntry:\n from .error import RenderEr"
},
{
"path": "ix-dev/community/actual-budget/templates/test_values/basic-values.yaml",
"chars": 508,
"preview": "resources:\n limits:\n cpus: 2.0\n memory: 4096\n\nactual_budget:\n additional_envs: []\nnetwork:\n host_network: false"
},
{
"path": "ix-dev/community/actual-budget/templates/test_values/hostnet-values.yaml",
"chars": 484,
"preview": "resources:\n limits:\n cpus: 2.0\n memory: 4096\n\nactual_budget:\n additional_envs: []\nnetwork:\n host_network: true\n"
},
{
"path": "ix-dev/community/actual-budget/templates/test_values/https-values.yaml",
"chars": 5992,
"preview": "resources:\n limits:\n cpus: 2.0\n memory: 4096\n\nactual_budget:\n additional_envs: []\nnetwork:\n host_network: false"
},
{
"path": "ix-dev/community/adguard-home/README.md",
"chars": 705,
"preview": "# AdGuard Home\n\n[AdGuard Home](https://github.com/AdguardTeam/AdGuardHome) is a network-wide ads & trackers blocking DNS"
},
{
"path": "ix-dev/community/adguard-home/app.yaml",
"chars": 1579,
"preview": "annotations:\n min_scale_version: 24.10.2.2\napp_version: v0.107.74\ncapabilities:\n- description: Adguard is able to chang"
},
{
"path": "ix-dev/community/adguard-home/app_migrations.yaml",
"chars": 103,
"preview": "migrations:\n- file: ip_port_migration\n from:\n max_version: 1.1.27\n target:\n min_version: 1.2.0\n"
},
{
"path": "ix-dev/community/adguard-home/item.yaml",
"chars": 289,
"preview": "categories:\n- networking\nicon_url: https://media.sys.truenas.net/apps/adguard-home/icons/icon.svg\nscreenshots:\n- https:/"
},
{
"path": "ix-dev/community/adguard-home/ix_values.yaml",
"chars": 331,
"preview": "images:\n image:\n repository: adguard/adguardhome\n tag: v0.107.74\n\nconsts:\n adguard_container_name: adguard\n con"
},
{
"path": "ix-dev/community/adguard-home/migrations/ip_port_migration",
"chars": 631,
"preview": "#!/usr/bin/python3\n\nimport os\nimport sys\nimport yaml\n\n\ndef migrate(values):\n values[\"network\"][\"web_port\"] = {\n "
},
{
"path": "ix-dev/community/adguard-home/questions.yaml",
"chars": 29589,
"preview": "groups:\n - name: AdGuard Home Configuration\n description: Configure AdGuard Home\n - name: Network Configuration\n "
},
{
"path": "ix-dev/community/adguard-home/templates/docker-compose.yaml",
"chars": 1593,
"preview": "{% set tpl = ix_lib.base.render.Render(values) %}\n\n{% set c1 = tpl.add_container(values.consts.adguard_container_name, \""
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/configs.py",
"chars": 2886,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .error import RenderErr"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/container.py",
"chars": 18084,
"preview": "from typing import Any, TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n from storage import IxStorage"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/depends.py",
"chars": 1195,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .error import RenderErr"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/deploy.py",
"chars": 581,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .resources import Resou"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/deps.py",
"chars": 3645,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .deps_cron import CronC"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/deps_cron.py",
"chars": 2410,
"preview": "from typing import TYPE_CHECKING, TypedDict\n\n\nif TYPE_CHECKING:\n from render import Render\n\n\ntry:\n from .error imp"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/deps_elastic.py",
"chars": 3327,
"preview": "from typing import TYPE_CHECKING, TypedDict, NotRequired\n\n\nif TYPE_CHECKING:\n from render import Render\n from stor"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/deps_guacd.py",
"chars": 1933,
"preview": "from typing import TYPE_CHECKING, TypedDict, NotRequired\n\n\nif TYPE_CHECKING:\n from render import Render\n\n\ntry:\n fr"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/deps_mariadb.py",
"chars": 3364,
"preview": "from typing import TYPE_CHECKING, TypedDict, NotRequired\n\nif TYPE_CHECKING:\n from render import Render\n from stora"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/deps_meilisearch.py",
"chars": 2931,
"preview": "from typing import TYPE_CHECKING, TypedDict, NotRequired\n\n\nif TYPE_CHECKING:\n from render import Render\n from stor"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/deps_memcached.py",
"chars": 2119,
"preview": "from typing import TYPE_CHECKING, TypedDict, NotRequired\n\n\nif TYPE_CHECKING:\n from render import Render\n\n\ntry:\n fr"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/deps_mongodb.py",
"chars": 3338,
"preview": "import urllib.parse\nfrom typing import TYPE_CHECKING, TypedDict\n\n\nif TYPE_CHECKING:\n from render import Render\n fr"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/deps_perms.py",
"chars": 5569,
"preview": "import json\nimport pathlib\nfrom typing import TYPE_CHECKING\n\n\nif TYPE_CHECKING:\n from render import Render\n from s"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/deps_postgres.py",
"chars": 8985,
"preview": "import re\nimport urllib.parse\nfrom typing import TYPE_CHECKING, TypedDict, NotRequired\n\n\nif TYPE_CHECKING:\n from rend"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/deps_redis.py",
"chars": 3373,
"preview": "import urllib.parse\nfrom typing import TYPE_CHECKING, TypedDict, NotRequired\n\nif TYPE_CHECKING:\n from render import R"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/deps_solr.py",
"chars": 2893,
"preview": "from typing import TYPE_CHECKING, TypedDict, NotRequired, List\n\n\nif TYPE_CHECKING:\n from render import Render\n fro"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/deps_tika.py",
"chars": 2041,
"preview": "from typing import TYPE_CHECKING, TypedDict, NotRequired\n\n\nif TYPE_CHECKING:\n from render import Render\n\n\ntry:\n fr"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/device.py",
"chars": 1244,
"preview": "try:\n from .error import RenderError\n from .validations import valid_fs_path_or_raise, allowed_device_or_raise, va"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/device_cgroup_rules.py",
"chars": 1664,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .error import RenderErr"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/devices.py",
"chars": 2645,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .error import RenderErr"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/dns.py",
"chars": 2705,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .error import RenderErr"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/docker_client.py",
"chars": 1286,
"preview": "import docker\nfrom typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .error im"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/environment.py",
"chars": 4934,
"preview": "from typing import Any, TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\ntry:\n from .error import Rende"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/error.py",
"chars": 92,
"preview": "class RenderError(Exception):\n \"\"\"Base class for exceptions in this module.\"\"\"\n\n pass\n"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/expose.py",
"chars": 941,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .error import RenderErr"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/extra_hosts.py",
"chars": 943,
"preview": "import ipaddress\nfrom typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .error"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/formatter.py",
"chars": 759,
"preview": "import json\nimport hashlib\n\n\ndef escape_dollar(text: str) -> str:\n return text.replace(\"$\", \"$$\")\n\n\ndef get_hashed_na"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/functions.py",
"chars": 9253,
"preview": "import re\nimport copy\nimport yaml\nimport bcrypt\nimport secrets\nimport urllib.parse\nfrom base64 import b64encode\nfrom typ"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/healthcheck.py",
"chars": 9111,
"preview": "import json\nfrom typing import Any, TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .error"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/labels.py",
"chars": 858,
"preview": "try:\n from .error import RenderError\n from .formatter import escape_dollar\n from .validations import valid_labe"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/networks.py",
"chars": 11424,
"preview": "from typing import TYPE_CHECKING\nfrom dataclasses import dataclass\n\nif TYPE_CHECKING:\n from render import Render\n\ntry"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/notes.py",
"chars": 12225,
"preview": "from dataclasses import dataclass\nfrom typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\nSHO"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/portals.py",
"chars": 2383,
"preview": "from typing import TYPE_CHECKING\n\nimport copy\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .error imp"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/ports.py",
"chars": 6071,
"preview": "import ipaddress\nfrom typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .error"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/render.py",
"chars": 3686,
"preview": "import copy\n\ntry:\n from .configs import Configs\n from .container import Container\n from .deps import Deps\n f"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/resources.py",
"chars": 3775,
"preview": "import re\nfrom typing import Any, TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .error i"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/restart.py",
"chars": 834,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .validations import val"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/security_opts.py",
"chars": 1673,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n\ntry:\n from .error import RenderErr"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/storage.py",
"chars": 4409,
"preview": "from typing import TYPE_CHECKING, TypedDict, Literal, NotRequired, Union\n\nif TYPE_CHECKING:\n from container import Co"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/sysctls.py",
"chars": 1222,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n from container import Container\n\nt"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_build_image.py",
"chars": 1508,
"preview": "import pytest\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_configs.py",
"chars": 2378,
"preview": "import pytest\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_container.py",
"chars": 19116,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_depends.py",
"chars": 1758,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_deps.py",
"chars": 45273,
"preview": "import json\nimport pytest\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\":"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_device.py",
"chars": 5216,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_device_cgroup_rules.py",
"chars": 2348,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_dns.py",
"chars": 2102,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_environment.py",
"chars": 6745,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_expose.py",
"chars": 1268,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_extra_hosts.py",
"chars": 1695,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_formatter.py",
"chars": 430,
"preview": "from formatter import escape_dollar\n\n\ndef test_escape_dollar():\n cases = [\n {\"input\": \"test\", \"expected\": \"tes"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_functions.py",
"chars": 7095,
"preview": "import re\nimport pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": "
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_healthcheck.py",
"chars": 12277,
"preview": "import pytest\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_labels.py",
"chars": 2639,
"preview": "import pytest\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_networks.py",
"chars": 11858,
"preview": "import pytest\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"ix_context\": {\n "
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_notes.py",
"chars": 9432,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"ix_context\": {\n "
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_portal.py",
"chars": 3590,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_ports.py",
"chars": 13200,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_render.py",
"chars": 818,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_resources.py",
"chars": 4902,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_restart.py",
"chars": 1764,
"preview": "import pytest\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_security_opts.py",
"chars": 2906,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_sysctls.py",
"chars": 1765,
"preview": "import pytest\n\n\nfrom render import Render\n\n\n@pytest.fixture\ndef mock_values():\n return {\n \"images\": {\n "
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_truenas_client.py",
"chars": 7933,
"preview": "import pytest\nfrom unittest.mock import MagicMock\n\nfrom truenas_client import TNClient, PortCombo, ValidationErrors, Ren"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_validations.py",
"chars": 4326,
"preview": "import pytest\nfrom unittest.mock import patch\n\nfrom pathlib import Path\nfrom validations import is_allowed_path, RESTRIC"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tests/test_volumes.py",
"chars": 26958,
"preview": "import pytest\n\n\nfrom render import Render\nfrom formatter import get_hashed_name_for_volume\n\n\n@pytest.fixture\ndef mock_va"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/tmpfs.py",
"chars": 2851,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from container import Container\n from render import Render\n "
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/truenas_client.py",
"chars": 4857,
"preview": "from dataclasses import asdict, dataclass\nfrom typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Ren"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/validations.py",
"chars": 11915,
"preview": "import os\nimport re\nimport ipaddress\nfrom pathlib import Path\n\n\ntry:\n from .error import RenderError\nexcept ImportErr"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/volume_mount.py",
"chars": 4605,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n from storage import IxStorage\n\ntry"
},
{
"path": "ix-dev/community/adguard-home/templates/library/base_v2_3_4/volume_mount_types.py",
"chars": 1290,
"preview": "from typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n from render import Render\n from storage import IxStorageVolum"
}
]
// ... and 65299 more files (download for full content)
About this extraction
This page contains the full source code of the truenas/apps GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 65499 files (337.3 MB), approximately 30.3M tokens, and a symbol index with 204591 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.