SHA256
1
0

Make roles more reusable

This commit is contained in:
2026-01-29 02:49:52 -05:00
parent 4436599693
commit 44261c95fb
60 changed files with 1273 additions and 353 deletions

View File

@@ -9,11 +9,9 @@
- name: "Build file lists for {{ var_prefix }}"
ansible.builtin.set_fact:
"{{ var_prefix }}_files": "{{ lookup('community.general.filetree',
role_path ~ '/common/' ~ (subdir | default('')),
role_path ~ '/' ~ group_names[0] ~ '/' ~ (subdir | default(''))) | selectattr('state', 'equalto', 'file') | rejectattr('path', 'match', '.*\\.j2$') | list }}"
role_path ~ '/' ~ (subdir | default(''))) | selectattr('state', 'equalto', 'file') | rejectattr('path', 'match', '.*\\.j2$') | list }}"
"{{ var_prefix }}_templates": "{{ lookup('community.general.filetree',
role_path ~ '/common/' ~ (subdir | default('')),
role_path ~ '/' ~ group_names[0] ~ '/' ~ (subdir | default(''))) | selectattr('state', 'equalto', 'file') | selectattr('path', 'match', '.*\\.j2$') | list }}"
role_path ~ '/' ~ (subdir | default(''))) | selectattr('state', 'equalto', 'file') | selectattr('path', 'match', '.*\\.j2$') | list }}"
- name: "Ensure directories exist for {{ var_prefix }}"
ansible.builtin.file:

View File

@@ -1,18 +1,20 @@
---
- name: Deploy home dotfiles
- name: Deploy selected home dotfile packages
ansible.builtin.include_tasks: ../../deploy_files.yml
vars:
var_prefix: dotfiles_home
subdir: home
subdir: "home/{{ item }}"
target_root: "{{ ansible_facts.env.HOME }}"
use_symlinks: true
become_root: false
loop: "{{ dotfiles_home_packages | default([]) }}"
- name: Deploy root dotfiles
- name: Deploy selected root dotfile packages
ansible.builtin.include_tasks: ../../deploy_files.yml
vars:
var_prefix: dotfiles_root
subdir: root
subdir: "root/{{ item }}"
target_root: "/"
use_symlinks: true
become_root: true
loop: "{{ dotfiles_root_packages | default([]) }}"

0
roles/quadlets/README.md Normal file
View File

View File

@@ -0,0 +1,129 @@
[GENERAL]
homepage = eBooks
auth_type = FORM
displaylength = -1
series_tab = False
config_tab_num = 2
toggles = False
launch_browser = False
imp_preflang = en, en-GB, en-US, eng, English, Unknown
date_lang = en_GB.UTF-8
destination_copy = True
ebook_dir = {{ lazylibrarian_ebook_dir | default('/ebooks') }}
download_dir = {{ lazylibrarian_download_dir | default('/downloads/complete/lazylibrarian') }}
ebook_type = epub, mobi, pdf, azw3
audiobook_type = mp3, m4b, opus, ogg
[API]
api_enabled = True
api_key = {{ lazylibrarian_api_key }}
api_ro_key = {{ lazylibrarian_api_ro_key }}
book_api = GoodReads
ol_api = True
gb_api = {{ lazylibrarian_gb_api | default('') }}
gb_country = US
[WEBSERVER]
http_user = {{ lazylibrarian_http_user | default('lazylibrarianuser') }}
http_pass = {{ lazylibrarian_http_pass }}
[LOGGING]
logdir = {{ lazylibrarian_logdir | default('/config/Logs') }}
detaileduilog = True
[IMPORTER]
multi_source = True
[TELEMETRY]
server_id = {{ lazylibrarian_server_id | default('') }}
[SABNZBD]
sab_host = {{ lazylibrarian_sab_host | default('localhost') }}
sab_port = {{ lazylibrarian_sab_port | default(8082) }}
sab_user = {{ sabnzbd_username | default('sabnzbduser') }}
sab_pass = {{ sabnzbd_password }}
sab_api = {{ sabnzbd_api_key }}
sab_cat = {{ lazylibrarian_sab_cat | default('lazylibrarian') }}
[USENET]
nzb_downloader_sabnzbd = True
[TORRENT]
tor_downloader_qbittorrent = True
seed_wait = False
[QBITTORRENT]
qbittorrent_host = {{ lazylibrarian_qbit_host | default('localhost') }}
qbittorrent_port = {{ lazylibrarian_qbit_port | default(8082) }}
qbittorrent_user = {{ qbittorrent_username | default('qbittorrentuser') }}
qbittorrent_pass = {{ qbittorrent_password }}
qbittorrent_label = {{ lazylibrarian_qbit_label | default('lazylibrarian') }}
[ANNA]
anna_key = {{ lazylibrarian_anna_key }}
anna = True
[POSTPROCESS]
ebook_dest_folder = $Author/$Title $$
audiobook_dest_folder = $Author/$Title
del_downloadfailed = True
[MAGAZINES]
mag_tab = False
[PROWL]
prowl_priority = -2
[PREPROCESS]
ebook_wanted_formats = azw3, mobi, epub
{% for indexer in lazylibrarian_newznab_indexers | default([]) %}
[Newznab_{{ loop.index0 }}]
dispname = {{ indexer.name }}
enabled = {{ indexer.enabled | default(True) | string }}
host = {{ indexer.host }}
api = {{ indexer.api }}
generalsearch = search
bookcat = {{ indexer.bookcat | default('7020') }}
{% if indexer.magcat is defined %}
magcat = {{ indexer.magcat }}
{% endif %}
{% if indexer.comiccat is defined %}
comiccat = {{ indexer.comiccat }}
{% endif %}
updated = {{ indexer.updated | default('2026-01-27') }}
dlpriority = {{ indexer.dlpriority | default(26) }}
{% endfor %}
{% for indexer in lazylibrarian_torznab_indexers | default([]) %}
[Torznab_{{ loop.index0 }}]
dispname = {{ indexer.name }}
enabled = {{ indexer.enabled | default(True) | string }}
host = {{ indexer.host }}
api = {{ indexer.api }}
generalsearch = search
{% if indexer.bookcat is defined %}
bookcat = {{ indexer.bookcat }}
{% endif %}
{% if indexer.magcat is defined %}
magcat = {{ indexer.magcat }}
{% endif %}
{% if indexer.comiccat is defined %}
comiccat = {{ indexer.comiccat }}
{% endif %}
updated = {{ indexer.updated | default('2026-01-27') }}
dlpriority = {{ indexer.dlpriority | default(26) }}
seeders = {{ indexer.seeders | default(1) }}
{% if indexer.seed_ratio is defined %}
seed_ratio = {{ indexer.seed_ratio }}
{% endif %}
{% endfor %}
{% for indexer in lazylibrarian_generic_indexers | default([]) %}
[GEN_{{ loop.index0 }}]
dispname = {{ indexer.name }}
enabled = {{ indexer.enabled | default(True) | string }}
host = {{ indexer.host }}
search = {{ indexer.search }}
{% endfor %}

View File

@@ -0,0 +1,11 @@
- name: lazylibrarian
type: container
image: localhost/lazylibrarian:latest
volumes:
- "{{ config_root }}/lazylibrarian:/config:Z"
- "{{ download_root }}/htpc:/downloads:z"
- "{{ media_root }}/ebooks:/ebooks:Z"
env:
TZ: "{{ tz }}"
command: ["/venv/bin/python", "/app/LazyLibrarian.py", "--nolaunch", "--port", "{{ lazylibrarian_port | default('5299') }}", "--datadir=/config"]
restart_policy: on-failure

View File

@@ -0,0 +1,48 @@
- name: lidarr
type: build
image: localhost/lidarr:latest
pull: missing
format: oci
force_rm: true
container_file: |
FROM {{ alpine_base_image }}
LABEL maintainer="{{ maintainer }}"
RUN apk add --no-cache \
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/main" \
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/community" \
icu-libs libintl sqlite-libs curl libmediainfo xmlstarlet jq \
&& url=$(curl -sL "https://api.github.com/repos/Lidarr/Lidarr/releases/latest" \
| jq -r '.assets[] | select(.name | test("linux-musl-core-x64.tar.gz$")) | .browser_download_url') \
&& [ -n "$url" ] \
&& curl -L -o /tmp/Lidarr.tar.gz "$url" \
&& mkdir -p /app && tar -xzf /tmp/Lidarr.tar.gz --strip-components=1 -C /app \
&& chmod +x /app/Lidarr \
&& rm /tmp/Lidarr.tar.gz
WORKDIR /app
- name: lidarr
type: container
image: localhost/lidarr:latest
volumes:
- "{{ config_root }}/lidarr:/config:Z"
- "{{ download_root }}/htpc:/downloads:z"
- "{{ media_root }}/music:/music:Z"
env:
TZ: "{{ tz }}"
LIDARR__APP__LAUNCHBROWSER: false
LIDARR__APP__INSTANCENAME: "{{ LIDARR__APP__INSTANCENAME | default('Lidarr') }}"
LIDARR__AUTH__METHOD: "{{ LIDARR__AUTH__METHOD | default('Forms') }}"
LIDARR__AUTH__APIKEY: "{{ LIDARR__AUTH__APIKEY | default(lookup('password', '/dev/null length=32 chars=ascii_letters,digits')) }}"
LIDARR__AUTH__ENABLED: "{{ LIDARR__AUTH__ENABLED | default(true) }}"
LIDARR__AUTH__REQUIRED: "{{ LIDARR__AUTH__REQUIRED | default('DisabledForLocalAddresses') }}"
LIDARR__SERVER__ENABLESSL: "{{ LIDARR__SERVER__ENABLESSL | default(false) }}"
LIDARR__SERVER__PORT: "{{ LIDARR__SERVER__PORT | default('8686') }}"
LIDARR__SERVER__SSLPORT: "{{ LIDARR__SERVER__SSLPORT | default('6868') }}"
LIDARR__SERVER__BINDADDRESS: "{{ LIDARR__SERVER__BINDADDRESS | default('*') }}"
LIDARR__SERVER__SSLCERTPATH: "{{ LIDARR__SERVER__SSLCERTPATH | default('/config/ssl/server.crt') }}"
LIDARR__SERVER__SSLCERTPASSWORD: "{{ LIDARR__SERVER__SSLCERTPASSWORD | default('/config/ssl/server.key') }}"
LIDARR__LOG__ANALYTICSENABLED: "{{ LIDARR__LOG__ANALYTICSENABLED | default(false) }}"
LIDARR__LOG__LEVEL: "{{ LIDARR__LOG__LEVEL | default('info') }}"
LIDARR__UPDATE__AUTOMATICALLY: "{{ LIDARR__UPDATE__AUTOMATICALLY | default(false) }}"
command: ["/app/Lidarr", "-nobrowser", "--data=/config"]
restart_policy: on-failure

View File

@@ -0,0 +1,44 @@
- name: prowlarr
type: build
image: localhost/prowlarr:latest
pull: missing
format: oci
force_rm: true
container_file: |
FROM {{ alpine_base_image }}
LABEL maintainer="{{ maintainer }}"
RUN apk add --no-cache \
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/main" \
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/community" \
libintl icu-libs sqlite-libs curl jq \
&& url=$(curl -sL "https://api.github.com/repos/Prowlarr/Prowlarr/releases/latest" \
| jq -r '.assets[] | select(.name | test("linux-musl-core-x64.tar.gz$")) | .browser_download_url') \
&& [ -n "$url" ] \
&& curl -L -o /tmp/Prowlarr.tar.gz "$url" \
&& mkdir -p /app \
&& tar -xzf /tmp/Prowlarr.tar.gz -C /app --strip-components=1 \
&& rm /tmp/Prowlarr.tar.gz
WORKDIR /app
- name: prowlarr
type: container
image: localhost/prowlarr:latest
volumes:
- "{{ config_root }}/prowlarr:/config:Z"
- "{{ download_root }}/htpc:/downloads:z"
env:
TZ: "{{ tz }}"
PROWLARR__APP__LAUNCHBROWSER: false
PROWLARR__APP__INSTANCENAME: "{{ PROWLARR__APP__INSTANCENAME | default('Prowlarr') }}"
PROWLARR__AUTH__METHOD: "{{ PROWLARR__AUTH__METHOD | default('Forms') }}"
PROWLARR__AUTH__REQUIRED: "{{ PROWLARR__AUTH__REQUIRED | default('DisabledForLocalAddresses') }}"
PROWLARR__AUTH__APIKEY: "{{ PROWLARR__AUTH__APIKEY | default(lookup('password', '/dev/null length=32 chars=ascii_letters,digits')) }}"
PROWLARR__SERVER__ENABLESSL: "{{ PROWLARR__SERVER__ENABLESSL | default(false) }}"
PROWLARR__SERVER__SSLPORT: "{{ PROWLARR__SERVER__PORT | default('6969') }}"
PROWLARR__SERVER__PORT: "{{ PROWLARR__SERVER__PORT | default('9696') }}"
PROWLARR__SERVER__BINDADDRESS: "{{ PROWLARR__SERVER__BINDADDRESS | default('*') }}"
PROWLARR__LOG__ANALYTICSENABLED: "{{ PROWLARR__LOG__ANALYTICSENABLED | default(false) }}"
PROWLARR__LOG__LEVEL: "{{ PROWLARR__LOG__LEVEL | default('info') }}"
PROWLARR__UPDATE__AUTOMATICALLY: "{{ PROWLARR__UPDATE__AUTOMATICALLY | default(false) }}"
command: ["/app/Prowlarr", "--nobrowser", "--data=/config"]
restart_policy: on-failure

View File

@@ -0,0 +1,127 @@
[Application]
FileLogger\Age=1
FileLogger\AgeType=1
FileLogger\Backup=true
FileLogger\DeleteOld=true
FileLogger\Enabled=false
FileLogger\MaxSizeBytes=66560
FileLogger\Path=/config/qBittorrent/data/logs
MemoryWorkingSetLimit=2048
[AutoRun]
OnTorrentAdded\Enabled=false
OnTorrentAdded\Program=
enabled=false
program=
[BitTorrent]
MergeTrackersEnabled={{ qbittorrent_merge_trackers | default(false) | lower }}
Session\AddExtensionToIncompleteFiles=true
Session\AddTorrentStopped=false
Session\AddTrackersEnabled={{ qbittorrent_add_trackers | default(false) | lower }}
Session\AdditionalTrackers={{ qbittorrent_additional_trackers | default('') }}
Session\AlternativeGlobalDLSpeedLimit={{ qbittorrent_alt_dl_limit | default(0) }}
Session\AlternativeGlobalUPSpeedLimit={{ qbittorrent_alt_up_limit | default(0) }}
Session\AnonymousModeEnabled={{ qbittorrent_anonymous_mode | default(true) | lower }}
Session\DefaultSavePath={{ qbittorrent_complete_dir | default('/downloads/complete') }}
Session\DisableAutoTMMByDefault=false
Session\DisableAutoTMMTriggers\CategorySavePathChanged=false
Session\DisableAutoTMMTriggers\DefaultSavePathChanged=false
Session\ExcludedFileNames=
Session\GlobalDLSpeedLimit={{ qbittorrent_dl_limit | default(0) }}
Session\GlobalMaxRatio={{ qbittorrent_max_ratio | default(1) }}
Session\GlobalMaxSeedingMinutes={{ qbittorrent_max_seed_minutes | default(0) }}
Session\GlobalUPSpeedLimit={{ qbittorrent_ul_limit | default(300) }}
Session\IgnoreLimitsOnLAN=true
Session\IgnoreSlowTorrentsForQueueing=true
Session\MaxActiveDownloads={{ qbittorrent_max_active_downloads | default(0) }}
Session\MaxActiveTorrents={{ qbittorrent_max_active_torrents | default(0) }}
Session\Port={{ qbittorrent_session_port | default(48442) }}
Session\QueueingSystemEnabled={{ qbittorrent_queueing_enabled | default(false) | lower }}
Session\SSL\Port={{ qbittorrent_ssl_port | default('11192') }}
Session\ShareLimitAction={{ qbittorrent_share_limit_action | default('Stop') }}
Session\TempPath={{ qbittorrent_temp_dir | default('/downloads/incomplete/qbittorrent') }}
Session\TempPathEnabled=true
Session\UseAlternativeGlobalSpeedLimit=true
[Core]
AutoDeleteAddedTorrentFile=IfAdded
[LegalNotice]
Accepted=true
[Meta]
MigrationVersion=8
[Network]
Cookies=@Invalid()
Proxy\HostnameLookupEnabled=false
Proxy\Profiles\BitTorrent=true
Proxy\Profiles\Misc=true
Proxy\Profiles\RSS=true
[Preferences]
Advanced\AnonymousMode={{ qbittorrent_anonymous_mode | default(true) | lower }}
Advanced\RecheckOnCompletion={{ qbittorrent_recheck_on_completion | default(false) | lower }}
Advanced\trackerPort={{ qbittorrent_tracker_port | default(9000) }}
Advanced\trackerPortForwarding=false
Bittorrent\MaxRatio={{ qbittorrent_max_ratio | default(1) }}
Connection\GlobalDLLimitAlt={{ qbittorrent_global_dl_limit_alt | default(0) }}
Connection\GlobalUPLimitAlt={{ qbittorrent_global_up_limit_alt | default(0) }}
Connection\PortRangeMin={{ qbittorrent_port_range_min | default(48442) }}
Connection\ResolvePeerCountries=true
Downloads\SavePath={{ qbittorrent_complete_dir | default('/downloads/complete') }}
Downloads\ScanDirsLastPath={{ qbittorrent_scan_dir | default('/torrents') }}
Downloads\ScanDirsV2=@Variant(\0\0\0\x1c\0\0\0\0)
Downloads\TempPath={{ qbittorrent_temp_dir | default('/downloads/incomplete/qbittorrent') }}
Downloads\TempPathEnabled=true
Downloads\UseIncompleteExtension=true
DynDNS\DomainName=changeme.dyndns.org
DynDNS\Enabled=false
DynDNS\Password=
DynDNS\Service=DynDNS
DynDNS\Username=
General\Locale={{ qbittorrent_locale | default('en') }}
MailNotification\email=
MailNotification\enabled=false
MailNotification\password=
MailNotification\req_auth=true
MailNotification\req_ssl=false
MailNotification\sender=qBittorrent_notification@example.com
MailNotification\smtp_server=smtp.changeme.com
MailNotification\username=
Queueing\IgnoreSlowTorrents=true
Queueing\MaxActiveDownloads={{ qbittorrent_max_active_downloads | default(20) }}
Queueing\MaxActiveTorrents={{ qbittorrent_max_active_torrents | default(20) }}
Queueing\QueueingEnabled=true
WebUI\Address={{ qbittorrent_host | default('') }}
WebUI\AlternativeUIEnabled=false
WebUI\AuthSubnetWhitelist={{ qbittorrent_subnet_whitelist | default('') }}
WebUI\AuthSubnetWhitelistEnabled=true
WebUI\BanDuration=3600
WebUI\CSRFProtection=true
WebUI\ClickjackingProtection=true
WebUI\CustomHTTPHeaders=
WebUI\CustomHTTPHeadersEnabled=false
WebUI\Enabled=true
WebUI\HTTPS\CertificatePath={{ qbittorrent_https_cert | default('/config/qBittorrent/config/ssl/server.crt') }}
WebUI\HTTPS\Enabled={{ qbittorrent_enable_https | default(false) | lower }}
WebUI\HTTPS\KeyPath={{ qbittorrent_https_key | default('/config/qBittorrent/config/ssl/server.key') }}
WebUI\HostHeaderValidation=false
WebUI\LocalHostAuth=false
WebUI\MaxAuthenticationFailCount=5
WebUI\Password_PBKDF2="{{ qbittorrent_password_pbkdf2 | default('') }}"
WebUI\Password_ha1={{ qbittorrent_password_ha1 | default('') }}
WebUI\Port={{ qbittorrent_ui_port | default(8082) }}
WebUI\ReverseProxySupportEnabled=false
WebUI\RootFolder=
WebUI\SecureCookie=true
WebUI\ServerDomains={{ qbittorrent_server_domains | default('*') }}
WebUI\SessionTimeout=3600
WebUI\TrustedReverseProxiesList=
WebUI\UseUPnP=true
WebUI\Username={{ qbittorrent_username | default('qbittorrentuser') }}
[RSS]
AutoDownloader\DownloadRepacks={{ qbittorrent_download_repacks | default(true) | lower }}
AutoDownloader\SmartEpisodeFilter=s(\\d+)e(\\d+), (\\d+)x(\\d+), "(\\d{4}[.\\-]\\d{1,2}[.\\-]\\d{1,2})", "(\\d{1,2}[.\\-]\\d{1,2}[.\\-]\\d{4})"

View File

@@ -0,0 +1,30 @@
- name: qbittorrent
type: build
image: localhost/qbittorrent:latest
pull: missing
format: oci
force_rm: true
container_file: |
FROM {{ alpine_base_image }}
LABEL maintainer="{{ maintainer }}"
RUN apk add --no-cache \
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/main" \
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/community" \
qbittorrent-nox \
&& mkdir -p /app \
&& ln -s /usr/bin/qbittorrent-nox /app/qbittorrent-nox
WORKDIR /app
- name: qbittorrent
type: container
image: localhost/qbittorrent:latest
volumes:
- "{{ config_root }}/qbittorrent:/config:Z"
- "{{ download_root }}/htpc:/downloads:z"
- "{{ monitor_root }}/torrents:/torrents:Z"
env:
TZ: "{{ tz }}"
command:
- "qbittorrent-nox"
- "--profile=/config"
restart_policy: on-failure

View File

@@ -0,0 +1,46 @@
- name: radarr
type: build
image: localhost/radarr:latest
pull: missing
format: oci
force_rm: true
container_file: |
FROM {{ alpine_base_image }}
LABEL maintainer="{{ maintainer }}"
RUN apk add --no-cache \
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/main" \
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/community" \
icu-libs libintl sqlite-libs curl libmediainfo xmlstarlet jq \
&& url=$(curl -sL "https://api.github.com/repos/Radarr/Radarr/releases/latest" \
| jq -r '.assets[] | select(.name | test("linux-musl-core-x64.tar.gz$")) | .browser_download_url') \
&& curl -L -o /tmp/radarr.tar.gz "$url" \
&& mkdir -p /app \
&& tar -xzf /tmp/radarr.tar.gz --strip-components=1 -C /app \
&& chmod +x /app/Radarr \
&& rm -rf /app/Radarr.Update
WORKDIR /app
- name: radarr
type: container
image: localhost/radarr:latest
volumes:
- "{{ config_root }}/radarr:/config:Z"
- "{{ download_root }}/htpc:/downloads:z"
- "{{ media_root }}/movies:/movies:Z"
env:
TZ: "{{ tz }}"
RADARR__APP__LAUNCHBROWSER: false
RADARR__APP__INSTANCENAME: "{{ RADARR__APP__INSTANCENAME | default('Radarr') }}"
RADARR__AUTH__METHOD: "{{ RADARR__AUTH__METHOD | default('Forms') }}"
RADARR__AUTH__APIKEY: "{{ RADARR__AUTH__APIKEY | default(lookup('password', '/dev/null length=32 chars=ascii_letters,digits')) }}"
RADARR__AUTH__ENABLED: "{{ RADARR__AUTH__ENABLED | default(true) }}"
RADARR__AUTH__REQUIRED: "{{ RADARR__AUTH__REQUIRED | default('DisabledForLocalAddresses') }}"
RADARR__SERVER__ENABLESSL: "{{ RADARR__SERVER__ENABLESSL | default(false) }}"
RADARR__SERVER__PORT: "{{ RADARR__SERVER__PORT | default('7878') }}"
RADARR__SERVER__BINDADDRESS: "{{ RADARR__SERVER__BINDADDRESS | default('*') }}"
RADARR__LOG__ANALYTICSENABLED: "{{ RADARR__LOG__ANALYTICSENABLED | default(false) }}"
RADARR__LOG__LEVEL: "{{ RADARR__LOG__LEVEL | default('info') }}"
RADARR__UPDATE__AUTOMATICALLY: "{{ RADARR__UPDATE__AUTOMATICALLY | default(false) }}"
command: ["/app/Radarr", "--nobrowser", "--data=/config"]
restart_policy: on-failure

View File

@@ -0,0 +1,42 @@
- name: sabnzbd
type: build
image: localhost/sabnzbd:latest
pull: missing
format: oci
force_rm: true
container_file: |
FROM {{ alpine_base_image }}
LABEL maintainer="{{ maintainer }}"
RUN \
rm -rf /etc/apk/repositories \
&& apk add --no-cache \
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/main" \
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/community" \
python3 py3-pip git unzip ca-certificates par2cmdline 7zip \
&& apk add --no-cache --virtual=.build-deps \
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/main" \
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/community" \
autoconf automake build-base openssl-dev libffi-dev python3-dev \
&& apk add --no-cache -X '{{ alpine_mirror }}/v3.14/main' unrar \
&& git clone --depth 1 --branch master https://github.com/sabnzbd/sabnzbd /app \
&& python3 -m venv /venv \
&& . /venv/bin/activate \
&& pip install --no-cache-dir -r /app/requirements.txt \
&& apk del --purge .build-deps
- name: sabnzbd
type: container
image: localhost/sabnzbd:latest
volumes:
- "{{ config_root }}/sabnzbd:/config:Z"
- "{{ download_root }}/htpc:/downloads:z"
- "{{ monitor_root }}/nzbs:/nzbs:Z"
env:
TZ: "{{ tz }}"
command:
- "/venv/bin/python"
- "-OO"
- "/app/SABnzbd.py"
- "--config-file=/config/sabnzbd.ini"
- "--browser=0"
restart_policy: on-failure

View File

@@ -0,0 +1,477 @@
__version__ = 19
__encoding__ = utf-8
[misc]
username = {{ sabnzbd_username | default("admin") }}
password = {{ sabnzbd_password | default("admin") }}
host = {{ sabnzbd_host | default("::") }}
port = {{ sabnzbd_http_port | default("8081") }}
api_key = {{ sabnzbd_api_key }}
nzb_key = {{ sabnzbd_nzb_key }}
download_dir = {{ sabnzbd_download_dir | default("/downloads/incomplete/sabnzbd") }}
complete_dir = {{ sabnzbd_complete_dir | default("/downloads/complete") }}
dirscan_dir = {{ sabnzbd_dirscan_dir | default("/nzbs") }}
web_dir = Glitter
web_color = Night
inet_exposure = 4
cleanup_list = sfv, m3u, nfo
unwanted_extensions = exe, com
ignore_samples = 1
enable_all_par = 1
new_nzb_on_failure = 1
replace_dots = 1
prospective_par_download = 1
deobfuscate_final_filenames = 1
direct_unpack = 1
pause_on_pwrar = 2
propagation_delay = 0
top_only = 1
pre_script = None
queue_complete = ""
queue_complete_pers = 0
bandwidth_perc = 100
refresh_rate = 1
interface_settings = '{"dateFormat":"fromNow","extraQueueColumns":["category","age"],"extraHistoryColumns":["size"],"displayCompact":false,"displayFullWidth":false,"confirmDeleteQueue":true,"confirmDeleteHistory":true,"keyboardShortcuts":true}'
queue_limit = 30
config_lock = 0
sched_converted = 0
notified_new_skin = 2
direct_unpack_tested = 1
check_new_rel = 1
auto_browser = 0
language = en
enable_https_verification = 1
https_port = {{ sabnzbd_https_port | default("9090") }}
bandwidth_max = 60M
cache_limit = 1G
https_cert = {{ sabnzbd_https_cert | default("/config/admin/server.cert") }}
https_key = {{ sabnzbd_https_key | default("/config/admin/server.key") }}
https_chain = ""
enable_https = {{ sabnzbd_enable_https | default(false) | int }}
permissions = ""
download_free = ""
complete_free = ""
fulldisk_autoresume = 0
script_dir = ""
nzb_backup_dir = ""
admin_dir = admin
dirscan_speed = 5
password_file = ""
log_dir = logs
max_art_tries = 3
load_balancing = 2
sfv_check = 1
quick_check_ext_ignore = nfo, sfv, srr
script_can_fail = 0
enable_recursive = 1
flat_unpack = 0
par_option = ""
pre_check = 0
nice = ""
win_process_prio = 3
ionice = ""
fail_hopeless_jobs = 1
fast_fail = 1
auto_disconnect = 1
no_dupes = 0
no_series_dupes = 0
series_propercheck = 1
auto_sort = ""
direct_unpack_threads = 3
folder_rename = 1
replace_spaces = 0
safe_postproc = 1
pause_on_post_processing = 0
sanitize_safe = 0
action_on_unwanted_extensions = 0
unwanted_extensions_mode = 0
history_retention = ""
enable_meta = 1
quota_size = ""
quota_day = ""
quota_resume = 0
quota_period = m
rating_enable = 0
rating_host = ""
rating_api_key = ""
rating_filter_enable = 0
rating_filter_abort_audio = 0
rating_filter_abort_video = 0
rating_filter_abort_encrypted = 0
rating_filter_abort_encrypted_confirm = 0
rating_filter_abort_spam = 0
rating_filter_abort_spam_confirm = 0
rating_filter_abort_downvoted = 0
rating_filter_abort_keywords = ""
rating_filter_pause_audio = 0
rating_filter_pause_video = 0
rating_filter_pause_encrypted = 0
rating_filter_pause_encrypted_confirm = 0
rating_filter_pause_spam = 0
rating_filter_pause_spam_confirm = 0
rating_filter_pause_downvoted = 0
rating_filter_pause_keywords = ""
enable_tv_sorting = 0
tv_sort_string = ""
tv_categories = tv,
enable_movie_sorting = 0
movie_sort_string = ""
movie_sort_extra = -cd%1
movie_extra_folder = 0
movie_categories = movies,
enable_date_sorting = 0
date_sort_string = ""
date_categories = tv,
schedlines = ,
rss_rate = 60
ampm = 0
replace_illegal = 1
start_paused = 0
preserve_paused_state = 0
enable_par_cleanup = 1
process_unpacked_par2 = 1
enable_unrar = 1
enable_unzip = 1
enable_7zip = 1
enable_filejoin = 1
enable_tsjoin = 1
overwrite_files = 0
ignore_unrar_dates = 0
backup_for_duplicates = 1
empty_postproc = 0
wait_for_dfolder = 0
rss_filenames = 0
api_logging = 1
html_login = 1
osx_menu = 1
osx_speed = 1
warn_dupl_jobs = 1
helpful_warnings = 1
keep_awake = 1
win_menu = 1
allow_incomplete_nzb = 0
enable_broadcast = 1
ipv6_hosting = 0
fixed_ports = 1
api_warnings = 1
disable_api_key = 0
no_penalties = 0
x_frame_options = 1
allow_old_ssl_tls = 0
num_decoders = 3
rss_odd_titles = nzbindex.nl/, nzbindex.com/, nzbclub.com/
req_completion_rate = 100.2
selftest_host = self-test.sabnzbd.org
movie_rename_limit = 100M
episode_rename_limit = 20M
size_limit = 0
show_sysload = 2
history_limit = 20
wait_ext_drive = 5
max_foldername_length = 246
nomedia_marker = ""
ipv6_servers = 1
url_base = /sabnzbd
host_whitelist = htpc,
local_ranges = ,
max_url_retries = 10
downloader_sleep_time = 10
ssdp_broadcast_interval = 15
socks5_proxy_url = ""
email_server = ""
email_to = ,
email_from = ""
email_account = ""
email_pwd = ""
email_endjob = 0
email_full = 0
email_dir = ""
email_rss = 0
email_cats = *,
num_simd_decoders = 2
ext_rename_ignore = ,
sorters_converted = 1
backup_dir = ""
replace_underscores = 0
tray_icon = 1
enable_season_sorting = 1
receive_threads = 2
switchinterval = 0.005
end_queue_script = None
no_smart_dupes = 0
dupes_propercheck = 1
history_retention_option = all
history_retention_number = 1
enable_multipar = 1
disable_archive = 0
ipv6_staging = 0
verify_xff_header = 0
config_conversion_version = 4
disable_par2cmdline = 0
unrar_parameters = ""
outgoing_nntp_ip = ""
[categories]
[[*]]
name = *
order = 0
pp = 3
script = None
dir = ""
newzbin = ""
priority = 0
[[music]]
name = music
order = 0
pp = ""
script = Default
dir = music
newzbin = music
priority = -100
[[tv]]
name = tv
order = 0
pp = ""
script = Default
dir = tv
newzbin = tv
priority = -100
[[movies]]
name = movies
order = 0
pp = ""
script = Default
dir = movies
newzbin = "movies, movie"
priority = -100
[[radarr]]
name = radarr
order = 0
pp = ""
script = Default
dir = radarr
newzbin = "movies, movie"
priority = -100
[[sonarr]]
name = sonarr
order = 0
pp = ""
script = Default
dir = sonarr
newzbin = tv
priority = -100
[[other]]
name = other
order = 1
pp = ""
script = Default
dir = other
newzbin = "games, game, other"
priority = -100
[[lidarr]]
name = lidarr
order = 2
pp = ""
script = Default
dir = lidarr
newzbin = music
priority = -100
[[readarr]]
name = readarr
order = 3
pp = ""
script = Default
dir = readarr
newzbin = ebooks
priority = -100
[[lazylibrarian]]
name = lazylibrarian
order = 4
pp = ""
script = Default
dir = lazylibrarian
newzbin = "ebooks, audiobooks"
priority = -100
[servers]
{% for s in sabnzbd_servers | default([]) %}
[[{{ s.name }}]]
name = {{ s.name }}
displayname = {{ s.displayname | default(s.name) }}
host = {{ s.host | default(s.name) }}
port = {{ s.port | default(563) }}
timeout = {{ s.timeout | default(60) }}
username = {{ s.username| default('') }}
password = {{ s.password| default('') }}
connections = {{ s.connections | default(50) }}
ssl = {{ s.ssl | default(1) }}
ssl_verify = {{ s.ssl_verify | default(1) }}
ssl_ciphers = {{ s.ssl_ciphers | default('""') }}
enable = {{ s.enable| default(1) }}
required = {{ s.required| default(0) }}
optional = {{ s.optional| default(0) }}
retention = {{ s.retention | default(0) }}
expire_date = {{ s.expire_date | default('""') }}
quota = {{ s.quota | default('""') }}
usage_at_start = {{ s.usage_at_start | default(0) }}
priority = {{ s.priority| default(0) }}
notes = {{ s.notes | default('""') }}
{% endfor %}
[logging]
log_level = 1
max_log_size = 5242880
log_backups = 5
[ncenter]
ncenter_enable = 0
ncenter_cats = *,
ncenter_prio_startup = 1
ncenter_prio_download = 0
ncenter_prio_pause_resume = 0
ncenter_prio_pp = 0
ncenter_prio_complete = 1
ncenter_prio_failed = 1
ncenter_prio_disk_full = 1
ncenter_prio_new_login = 0
ncenter_prio_warning = 0
ncenter_prio_error = 0
ncenter_prio_queue_done = 1
ncenter_prio_other = 1
ncenter_prio_quota = 1
[acenter]
acenter_enable = 0
acenter_cats = *,
acenter_prio_startup = 0
acenter_prio_download = 0
acenter_prio_pause_resume = 0
acenter_prio_pp = 0
acenter_prio_complete = 1
acenter_prio_failed = 1
acenter_prio_disk_full = 1
acenter_prio_new_login = 0
acenter_prio_warning = 0
acenter_prio_error = 0
acenter_prio_queue_done = 1
acenter_prio_other = 1
acenter_prio_quota = 1
[ntfosd]
ntfosd_enable = 1
ntfosd_cats = *,
ntfosd_prio_startup = 1
ntfosd_prio_download = 0
ntfosd_prio_pause_resume = 0
ntfosd_prio_pp = 0
ntfosd_prio_complete = 1
ntfosd_prio_failed = 1
ntfosd_prio_disk_full = 1
ntfosd_prio_new_login = 0
ntfosd_prio_warning = 0
ntfosd_prio_error = 0
ntfosd_prio_queue_done = 1
ntfosd_prio_other = 1
ntfosd_prio_quota = 1
[prowl]
prowl_enable = 0
prowl_cats = *,
prowl_apikey = ""
prowl_prio_startup = -3
prowl_prio_download = -3
prowl_prio_pause_resume = -3
prowl_prio_pp = -3
prowl_prio_complete = 0
prowl_prio_failed = 1
prowl_prio_disk_full = 1
prowl_prio_new_login = -3
prowl_prio_warning = -3
prowl_prio_error = -3
prowl_prio_queue_done = 0
prowl_prio_other = 0
prowl_prio_quota = 0
[pushover]
pushover_token = ""
pushover_userkey = ""
pushover_device = ""
pushover_emergency_expire = 3600
pushover_emergency_retry = 60
pushover_enable = 0
pushover_cats = *,
pushover_prio_startup = -3
pushover_prio_download = -2
pushover_prio_pause_resume = -2
pushover_prio_pp = -3
pushover_prio_complete = -1
pushover_prio_failed = -1
pushover_prio_disk_full = 1
pushover_prio_new_login = -3
pushover_prio_warning = 1
pushover_prio_error = 1
pushover_prio_queue_done = -1
pushover_prio_other = -1
pushover_prio_quota = -1
[pushbullet]
pushbullet_enable = 0
pushbullet_cats = *,
pushbullet_apikey = ""
pushbullet_device = ""
pushbullet_prio_startup = 0
pushbullet_prio_download = 0
pushbullet_prio_pause_resume = 0
pushbullet_prio_pp = 0
pushbullet_prio_complete = 1
pushbullet_prio_failed = 1
pushbullet_prio_disk_full = 1
pushbullet_prio_new_login = 0
pushbullet_prio_warning = 0
pushbullet_prio_error = 0
pushbullet_prio_queue_done = 0
pushbullet_prio_other = 1
pushbullet_prio_quota = 1
[nscript]
nscript_enable = 0
nscript_cats = *,
nscript_script = ""
nscript_parameters = ""
nscript_prio_startup = 1
nscript_prio_download = 0
nscript_prio_pause_resume = 0
nscript_prio_pp = 0
nscript_prio_complete = 1
nscript_prio_failed = 1
nscript_prio_disk_full = 1
nscript_prio_new_login = 0
nscript_prio_warning = 0
nscript_prio_error = 0
nscript_prio_queue_done = 1
nscript_prio_other = 1
nscript_prio_quota = 1
[apprise]
apprise_enable = 0
apprise_cats = *,
apprise_urls = ""
apprise_target_startup = ""
apprise_target_startup_enable = 0
apprise_target_download = ""
apprise_target_download_enable = 0
apprise_target_pause_resume = ""
apprise_target_pause_resume_enable = 0
apprise_target_pp = ""
apprise_target_pp_enable = 0
apprise_target_complete = ""
apprise_target_complete_enable = 1
apprise_target_failed = ""
apprise_target_failed_enable = 1
apprise_target_disk_full = ""
apprise_target_disk_full_enable = 0
apprise_target_new_login = ""
apprise_target_new_login_enable = 1
apprise_target_warning = ""
apprise_target_warning_enable = 0
apprise_target_error = ""
apprise_target_error_enable = 0
apprise_target_queue_done = ""
apprise_target_queue_done_enable = 0
apprise_target_other = ""
apprise_target_other_enable = 1
apprise_target_quota = ""
apprise_target_quota_enable = 1

View File

@@ -0,0 +1,43 @@
- name: sonarr
type: build
image: localhost/sonarr:latest
pull: missing
format: oci
force_rm: true
container_file: |
FROM {{ alpine_base_image }}
LABEL maintainer="{{ maintainer }}"
RUN apk add --no-cache \
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/main" \
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/community" \
libintl sqlite-libs icu-libs curl jq \
&& url=$(curl -sL "https://api.github.com/repos/Sonarr/Sonarr/releases/latest" \
| jq -r '.assets[] | select(.name | test("linux-musl-x64.tar.gz$")) | .browser_download_url') \
&& curl -L -o /tmp/Sonarr.tar.gz "$url" \
&& mkdir -p /app && tar -xzf /tmp/Sonarr.tar.gz -C /app --strip-components=1
WORKDIR /app
- name: sonarr
type: container
image: localhost/sonarr:latest
volumes:
- "{{ config_root }}/sonarr:/config:Z"
- "{{ download_root }}/htpc:/downloads:z"
- "{{ media_root }}/tv:/tv:Z"
env:
TZ: "{{ tz }}"
SONARR__APP__LAUNCHBROWSER: false
SONARR__APP__INSTANCENAME: "{{ SONARR__APP__INSTANCENAME | default('Sonarr') }}"
SONARR__AUTH__METHOD: "{{ SONARR__AUTH__METHOD | default('Forms') }}"
SONARR__AUTH__APIKEY: "{{ SONARR__AUTH__APIKEY | default(lookup('password', '/dev/null length=32 chars=ascii_letters,digits')) }}"
SONARR__SERVER__ENABLESSL: "{{ SONARR__SERVER__ENABLESSL | default(false) }}"
SONARR__SERVER__SSLPORT: "{{ SONARR__SERVER__SSLPORT | default('9898') }}"
SONARR__SERVER__PORT: "{{ SONARR__SERVER__PORT | default('8989') }}"
SONARR__SERVER__BINDADDRESS: "{{ SONARR__SERVER__BINDADDRESS | default('*') }}"
SONARR__SERVER__SSLCERTPATH: "{{ SONARR__SERVER__SSLCERTPATH | default('/config/ssl/server.crt') }}"
SONARR__SERVER__SSLCERTPASSWORD: "{{ SONARR__SERVER__SSLCERTPASSWORD | default('/config/ssl/server.key') }}"
SONARR__LOG__ANALYTICSENABLED: "{{ SONARR__LOG__ANALYTICSENABLED | default(false) }}"
SONARR__UPDATE__AUTOMATICALLY: "{{ SONARR__UPDATE__AUTOMATICALLY | default(false) }}"
SONARR__LOG__LEVEL: "{{ SONARR__LOG__LEVEL | default('info') }}"
command: ["/app/Sonarr", "-data=/config"]
restart_policy: on-failure

View File

@@ -0,0 +1,46 @@
---
- name: Deploy quadlet app configs
ansible.builtin.include_tasks: ../../deploy_files.yml
vars:
var_prefix: quadlets
subdir: ''
target_root: "{{ ansible_facts.env.HOME }}/.config"
use_symlinks: false
become_root: false
when: quadlets_deploy_configs | default(false)
- name: Initialize quadlet specs
ansible.builtin.set_fact:
quadlets_all_specs: []
- name: Load all quadlet definitions
ansible.builtin.set_fact:
quadlets_all_specs: "{{ quadlets_all_specs + (lookup('file', item.path) | from_yaml) }}"
loop: "{{ lookup('ansible.builtin.find', role_path, patterns='quadlets.yml', recurse=yes).files }}"
- name: Build final quadlet specs with pod injection
ansible.builtin.set_fact:
quadlets_specs: "{{ (pods | default([])) | map('combine', {'type': 'pod'}) | list }}"
- name: Add containers to quadlet specs with pod injection
ansible.builtin.set_fact:
quadlets_specs: "{{ quadlets_specs + [container_spec[0] | combine({'pod': item.0.name})] }}"
loop: "{{ pods | default([]) | subelements('containers') }}"
vars:
container_spec: "{{ quadlets_all_specs | selectattr('name', 'equalto', item.1) | selectattr('type', 'equalto', 'container') | list }}"
when: container_spec | length > 0
- name: Add build specs for enabled containers
ansible.builtin.set_fact:
quadlets_specs: "{{ quadlets_specs + [item] }}"
loop: "{{ quadlets_all_specs }}"
when:
- item.type == 'build'
- item.name in (pods | default([]) | map(attribute='containers') | flatten)
- name: Deploy quadlets using fedora.linux_system_roles.podman
ansible.builtin.include_role:
name: fedora.linux_system_roles.podman
vars:
podman_quadlet_specs: "{{ quadlets_specs }}"
when: quadlets_specs is defined and quadlets_specs | length > 0

View File

@@ -0,0 +1,116 @@
---
# Traefik dynamic configuration for HTPC services
# Auto-generated by Ansible - deployed as dotfile
http:
middlewares:
redirect-https:
redirectScheme:
scheme: https
permanent: true
routers:
redirect-to-https:
rule: "HostRegexp(`{any:.*}`)"
entryPoints:
- web
middlewares:
- redirect-https
service: noop
sabnzbd:
rule: "PathPrefix(`/sabnzbd`)"
service: sabnzbd
entryPoints:
- websecure
tls: {}
qbittorrent:
rule: "PathPrefix(`/qbittorrent`)"
service: qbittorrent
entryPoints:
- websecure
tls: {}
sonarr:
rule: "PathPrefix(`/sonarr`)"
service: sonarr
entryPoints:
- websecure
tls: {}
radarr:
rule: "PathPrefix(`/radarr`)"
service: radarr
entryPoints:
- websecure
tls: {}
lidarr:
rule: "PathPrefix(`/lidarr`)"
service: lidarr
entryPoints:
- websecure
tls: {}
lazylibrarian:
rule: "PathPrefix(`/lazylibrarian`)"
service: lazylibrarian
entryPoints:
- websecure
tls: {}
prowlarr:
rule: "PathPrefix(`/prowlarr`)"
service: prowlarr
entryPoints:
- websecure
tls: {}
dashboard:
rule: "PathPrefix(`/dashboard`)"
service: api@internal
entryPoints:
- websecure
tls: {}
services:
noop:
loadBalancer:
servers:
- url: "http://localhost"
sabnzbd:
loadBalancer:
servers:
- url: "http://localhost:8081"
qbittorrent:
loadBalancer:
servers:
- url: "http://localhost:8082"
sonarr:
loadBalancer:
servers:
- url: "http://localhost:{{ SONARR__SERVER__PORT | default('8989') }}"
radarr:
loadBalancer:
servers:
- url: "http://localhost:{{ RADARR__SERVER__PORT | default('7878') }}"
lidarr:
loadBalancer:
servers:
- url: "http://localhost:{{ LIDARR__SERVER__PORT | default('8686') }}"
lazylibrarian:
loadBalancer:
servers:
- url: "http://localhost:{{ lazylibrarian_port | default('5299') }}"
prowlarr:
loadBalancer:
servers:
- url: "http://localhost:{{ PROWLARR__SERVER__PORT | default('9696') }}"

View File

@@ -0,0 +1,19 @@
- name: traefik
type: container
image: docker.io/traefik:latest
pull: newer
volumes:
- "{{ config_root }}/traefik:/etc/traefik:Z"
env:
TZ: "{{ tz }}"
command:
- "--api.dashboard=true"
- "--api.insecure=true"
- "--providers.file.directory=/etc/traefik/dynamic"
- "--providers.file.watch=true"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--entrypoints.websecure.http.tls.certFile=/etc/traefik/server.crt"
- "--entrypoints.websecure.http.tls.keyFile=/etc/traefik/server.key"
- "--log.level=INFO"
restart_policy: on-failure

View File

@@ -0,0 +1 @@
{{ traefik_server_cert }}

View File

@@ -0,0 +1 @@
{{ traefik_server_key }}

View File

@@ -0,0 +1,36 @@
- name: unpackerr
type: build
image: localhost/unpackerr:latest
pull: missing
format: oci
force_rm: true
container_file: |
FROM {{ alpine_base_image }}
LABEL maintainer="{{ maintainer }}"
RUN apk add --no-cache \
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/main" \
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/community" \
curl tar jq \
&& url=$(curl -sL "https://api.github.com/repos/davidnewhall/Unpackerr/releases/latest" \
| jq -r '.assets[] | select(.name == "unpackerr.amd64.linux.gz") | .browser_download_url') \
&& [ -n "$url" ] \
&& curl -L -o /tmp/unpackerr.gz "$url" \
&& mkdir -p /app \
&& gunzip -c /tmp/unpackerr.gz > /app/unpackerr \
&& chmod +x /app/unpackerr \
&& rm /tmp/unpackerr.gz
WORKDIR /app
- name: unpackerr
type: container
image: localhost/unpackerr:latest
volumes:
- "{{ config_root }}/unpackerr:/config:Z"
- "{{ download_root }}/htpc:/downloads:z"
env:
TZ: "{{ tz }}"
UNPACKERR__LOG__ANALYTICSENABLED: "{{ UNPACKERR__LOG__ANALYTICSENABLED | default(false) }}"
UNPACKERR__UPDATE__AUTOMATICALLY: "{{ UNPACKERR__UPDATE__AUTOMATICALLY | default(false) }}"
UNPACKERR__LOG__LEVEL: "{{ UNPACKERR__LOG__LEVEL | default('info') }}"
command: ["/app/unpackerr"]
restart_policy: on-failure